Métodos para encontrar novos sinalizadores de rastreamento no SQL Server

38

Existem muitas bandeiras de rastreamento por aí. Alguns estão bem documentados, outros não, e outros encontraram o caminho para o status de comportamento padrão na versão de 2016. Além dos canais oficiais de suporte, funcionários da Microsoft etc., quais são as maneiras de encontrar novos sinalizadores de rastreamento?

Eu li algumas postagens recentes de Aaron Bertrand aqui e aqui , mas não vi nada sobre as novas bandeiras de rastreamento.

Copiei os dados e o arquivo de log do mssqlsystemresource para um novo local e o anexei como um banco de dados comum para vasculhar as tabelas e visualizações do sistema, mas não localizei nada imediatamente. Eu considerei pegar uma lista de sinalizadores de rastreamento conhecidos e percorrer números que não estão nessa lista, para ver quais DBCC TRACEON permitiriam, mas queria fazer a pergunta aqui primeiro.

Supondo que o comando DBCC para habilitá-los precise fazer check-in com algum recurso para garantir que o Sinalizador de Rastreio seja válido, aonde ele chega? Existe um arquivo .dll ou outro sistema que contém uma lista?

Eu sei que a pergunta lança uma ampla rede, mas o que estimulou isso foi a leitura de um sinalizador de rastreamento com comportamento específico pretendido, juntamente com um novo recurso em 2016 que não estava tendo o efeito descrito. Meu pensamento inicial foi que talvez os números tenham sido transpostos de alguma forma, como 7129 se tornando 7219. Eu esperava obter uma lista de sinalizadores de rastreamento válidos dentro de um intervalo, digamos 7000-7999, para procurar permutações. Testar todos eles, como sinalizadores DBCC TRACEON e parâmetros de inicialização, seria um incômodo, combinado com o teste dos resultados em relação ao comportamento do recurso.

Erik Darling
fonte

Respostas:

42

Não há nada que você possa fazer para encontrar a lista, exceto pedir ou buscá-las em posts / decks de slides / etc. A lista existe apenas no código, em um arquivo de cabeçalho em que os números de sinalizadores de rastreamento válidos são mapeados para nomes em uma grande enumeração no código C ++ e, em seguida, os nomes são usados ​​no restante do código.

Como Aaron disse, você pode ativar qualquer número de sinalizador de rastreamento e, se ele não fizer nada ou não exercer a funcionalidade para a qual o sinalizador de rastreamento é relevante, você não notará nenhuma diferença no comportamento.

DBCC TRACEON não verifica nada - como não há uma lista em tempo de execução de quais números são válidos ou não - apenas habilita esse número de sinalizador de rastreamento em um bitmap de quais sinalizadores estão definidos para essa conexão / globalmente.

O problema de ter uma verificação de validade é que exporia quais sinalizadores de rastreamento são válidos, permitindo que eles fossem descobertos. Dessa forma, a 'lista válida' é efetivamente ofuscada, e é isso que a equipe do SQL deseja.

Em relação à sugestão de Kin em um comentário que o SQL Server deveria ter select * from sys.available_trace_flags- Sim e não. Existem muitos sinalizadores de rastreamento que são altamente prejudiciais ao desempenho e são necessários apenas para depurar problemas sob orientação do Suporte ao Produto, mas o SQL Server pode listar os sinalizadores 'seguros'.

Paul S. Randal
fonte
2
Um pequeno ajuste - o DBCC TRACEON realmente verifica alguma coisa. Esta lista mostra o código que percorre os sinalizadores de rastreamento a partir de 1. Todas as versões atuais do SQL Server são interrompidas e geram
Brent Ozar
41

Quais são as maneiras de encontrar novos sinalizadores de rastreamento?

Na maioria das vezes, tudo se resume a dispor de tempo e recursos emocionais para procurá-los.

Certamente, é possível escrever um script para percorrer possíveis números de sinalizadores de rastreamento e analisar os efeitos, mas isso nem sempre é proveitoso. Há muitas razões para isso, mas frustrações comuns incluem o fato de que alguns sinalizadores de rastreamento são eficazes apenas em combinação com outros, alguns funcionam apenas -Tna inicialização ou, quando usados ​​com DBCC TRACEON, outros apenas com OPTION (QUERYTRACEON). Alguns exigem comandos não documentados, ou extensões de comando, ou para que um recurso específico seja ativado também. Alguns só produzem efeitos se você souber onde procurar esses efeitos. E assim por diante e ... muito ... e assim por diante.

Dito isto, talvez a técnica mais eficaz seja a execução de uma consulta ou comando específico passo a passo com um depurador ou outra ferramenta de criação de perfil anexada, comparando os caminhos seguidos com os sinalizadores de rastreamento ativados e desativados. Se isso parece demorado, é porque é.

Para mim, algo tem que ser potencialmente muito interessante ou estar relacionado a um problema do mundo real sem uma solução melhor para eu sequer pensar em entrar nele. Também é útil se você já passou por esse processo centenas ou milhares de vezes antes, para ter uma idéia geral do tipo de coisa que está procurando, qual faixa de sinalizadores de rastreio é mais provável que seja eficaz e qual parte da base de código vai ser interessante.

Definir um ponto de interrupção CSessionTraceFlags::CheckSessionTraceInternale verificar o valor do edxregistro (para ver qual sinalizador de rastreio está sendo verificado) pode ser útil em casos simples, mas os casos interessantes geralmente não são simples - e nem todos os sinalizadores de rastreio são verificados no ponto em que eles afetam o caminho do código usado.

Há uma lista bastante pequena de sinalizadores de rastreamento oficiais . Esses são os sinalizadores que foram totalmente testados e são (e serão) suportados pelo CSS e, finalmente, pelos desenvolvedores do produto. Eles também são sinalizadores com um caso de uso comum o suficiente para valer a pena documentar.

Qualquer outro sinalizador de rastreamento encontrado é uma curiosidade que pode ter efeitos inesperados em várias situações (diferentes compilações, SKUs, configurações de segurança, diferentes recursos ... qualquer outra coisa que você possa ou não possa imaginar). Estes serão apenas 'suportados' pela pessoa que escreveu sobre eles, se houver.

Existem várias listas não oficiais, a melhor que eu conheço é Uma coleção tópica de sinalizadores do SQL Server por Aaron Morelli (atualmente na v6, em abril de 2016).

Tudo isso dito, o Microsoft CSS (em última instância) tem acesso a todos os sinalizadores de rastreamento, para que eles possam aconselhá-lo sobre qualquer um que você encontrar, mesmo que não esteja na lista oficial. Eles podem optar por não dizer nada, é claro, e pode haver uma taxa envolvida; Realmente não sei, nunca tendo seguido esse caminho.

Paul White diz que a GoFundMonica
fonte