Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo mostra como configurar o rastreamento do Driver Manager unixODBC no Linux e macOS. O rastreamento registra chamadas de API ODBC que você faz pelo Gerenciador de Drivers. Ele não rastreia os eventos internos do driver ODBC da Microsoft. Para a diferença entre registros diagnósticos e camadas de rastreamento, veja diagnósticos ODBC.
A seção [ODBC] de odbcinst.ini controla o rastreamento para aplicações que utilizam a configuração do sistema unixODBC. Defina Trace=Yes e especifique um caminho absoluto para TraceFile:
[ODBC]
Trace=Yes
TracePid=No
TraceFile=/home/myappuser/odbc-trace.ABC123/odbc.log
O caminho é ilustrativo; use o caminho absoluto privado gerado no procedimento a seguir.
Mantenha neste arquivo odbcinst.ini as entradas de registro de drivers exigidas pelo seu aplicativo. A seção [ODBC] é global para a configuração. Adicionar Trace=Yes a uma seção específica do driver não escopa o rastreamento do Gerenciador de Drivers do unixODBC para esse driver.
O caminho padrão do arquivo de rastreamento não é restrito ao escopo da sua aplicação. Use um diretório privado e um caminho explícito para o arquivo de rastreamento em vez disso. O rastreamento pode afetar o desempenho, e a saída pode conter dados da aplicação. Restrinja o acesso ao arquivo e capture apenas as chamadas que você precisar.
Use uma build do unixODBC que inclua a correção upstream do buffer de rastreamento de diagnóstico. Pacotes de fornecedores podem incluir um backport; verifique os patches do pacote em vez de depender apenas do número da versão. Sem a correção, a aplicação pode abortar em SQLGetDiagRec enquanto o gerenciador formata um erro nativo para rastreamento.
Iniciar o aplicativo Trace One
Abra um shell dedicado para Bash e execute, nessa mesma sessão de terminal, os comandos deste procedimento. O primeiro comando habilita o tratamento fail-fast, de modo que uma falha na criação de diretórios, na alteração de permissão ou na cópia da configuração interrompe o processo antes do lançamento do aplicativo. Mantenha o shell aberto para as etapas seguintes e digite exit após a limpeza.
Execute
odbcinst -je anote os caminhos para o driver do sistema e os arquivos de fonte de dados do sistema. Crie diretórios privados de configuração e rastreio, depois copie os arquivos de configuração do sistema. Substitua os caminhos de arquivo de exemplo pelos que estão reportados no seu sistema:set -eu config_dir=$(mktemp -d "$HOME/odbc-trace-config.XXXXXX") trace_dir=$(mktemp -d "$HOME/odbc-trace.XXXXXX") if [ "$(printf '%s' "$trace_dir/odbc.log" | wc -c)" -gt 62 ]; then printf 'Use a shorter parent path for the trace directory (log path exceeds 62 bytes).\n' >&2 rmdir "$trace_dir" "$config_dir" exit 1 fi driver_file=/etc/odbcinst.ini data_sources_file=/etc/odbc.ini chmod 700 "$config_dir" "$trace_dir" cp "$driver_file" "$config_dir/odbcinst.ini" if [ -f "$data_sources_file" ]; then cp "$data_sources_file" "$config_dir/odbc.ini" else printf '[ODBC Data Sources]\n' > "$config_dir/odbc.ini" fi chmod 600 "$config_dir/odbcinst.ini" "$config_dir/odbc.ini" printf '%s\n' "$trace_dir/odbc.log"A implementação fixada da configuração de rastreamento do unixODBC fornece um buffer de 64 bytes ao leitor de perfil de registro. Esse leitor copia com segurança um caminho de até 62 bytes e seu terminador nulo. Para caminhos mais longos, seu ramo de truncamento não adiciona um terminador nulo. Verificações com unixODBC 2.3.14 no Linux e macOS confirmaram a criação correta do rastreamento em 62 bytes. O verificador conta bytes e para antes da execução se o caminho gerado for muito longo. Se parar, use um caminho pai gravável mais curto no
trace_dircomando, mantenhamktemp -d, e reinicie o procedimento.Guarde todas as entradas de registro do driver que a aplicação precisa na
odbcinst.inicopiada. Se a aplicação usar um nome de fonte de dados do sistema (DSN), mantenha sua definição noodbc.inicopiado. Se o valor deDriverfor um nome de registro, mantenha essa definição correspondente noodbcinst.inicopiado. Se o valor for um caminho absoluto da biblioteca, confirme que a biblioteca existe e é acessível nesse caminho. Na revisão unixODBC fixada, um valor começando com/é usado como caminho da biblioteca; outros valores são resolvidos por meio de um registro de driver. Para mais informações, consulte o manual do odbc.ini do unixODBC e a implementação fixada de pesquisa de driver. Os comandos deixam a configuração DSN do usuário no lugar.Na seção privada
odbcinst.ini, adicione ou atualize a seção global[ODBC]. Use o caminho absoluto impresso pelo comando anterior paraTraceFile; não crie uma segunda seção[ODBC]:[ODBC] Trace=Yes TracePid=No TraceFile=/home/myappuser/odbc-trace.ABC123/odbc.logSubstitua o caminho de exemplo pelo caminho exato impresso na etapa anterior. Defina
TracePid=Nomesmo que a configuração copiada a habilite, para que o rastreio use o arquivo único mostrado aqui.Inicie o aplicativo com o diretório privado de configuração do sistema:
if (umask 077; ODBCSYSINI="$config_dir" ODBCINSTINI=odbcinst.ini \ ODBCSEARCH=ODBC_BOTH_DSN ./your-app); then : else app_status=$? printf 'Application exited with status %s\n' "$app_status" >&2 fiO arquivo de rastreamento deve conter chamadas de API ODBC e seus códigos de retorno. O condicional mantém o shell aberto para limpeza mesmo que a aplicação saia com um erro. O Gerenciador de Drivers unixODBC lê seu diretório de configuração do sistema a partir de
ODBCSYSINI. DefinaODBCINSTINI=odbcinst.inipara esse processo filho para que uma substituição herdada do nome do arquivo de registro não contorne o arquivo copiado. Para a consulta de nome de arquivo, veja a implementação de configuração destacada do unixODBC.ODBCSEARCH=ODBC_BOTH_DSNsubstitui um modo de busca DSN herdado apenas para usuário ou apenas para sistema para esta inicialização. Essas configurações deixam o arquivo DSN do usuário existente no lugar. unixODBC pesquisa tanto arquivos DSN do sistema quanto do usuário, e o DSN do usuário tem precedência quando o mesmo nome existe em ambos. Verifique se há um DSN duplicado do usuário se o aplicativo parecer usar configurações diferentes do DSN do sistema copiado. Se o aplicativo requer intencionalmente um modo de busca restrito, preserve esse modo e verifique se o arquivo DSN selecionado contém a definição necessária. Para mais informações, veja a implementação fixada do modo de busca do unixODBC, o manual isql e o manual odbc.ini.
Quando a reprodução terminar, saia da aplicação para liberar seus handles do ambiente ODBC. Defina Trace=No ou remova as [ODBC] configurações de rastreamento antes de outra inicialização. Restringa o acesso ao registro antes de inspecioná-lo ou compartilhá-lo:
if [ -f "$trace_dir/odbc.log" ]; then
chmod 600 "$trace_dir/odbc.log"
else
printf 'No trace file was created. Check that the application started and allocated an ODBC environment.\n' >&2
fi
Uma aplicação que não inicia ou fecha antes de alocar um ambiente ODBC pode não criar um arquivo de rastreamento. A verificação reporta o arquivo ausente e mantém a rotina de limpeza acessível no shell dedicado.
Elimine conteúdos sensíveis antes de compartilhar o trace. Apague o registro quando não precisar mais. Remova os arquivos de configuração e diretórios privados somente se você os criou para esse rastreamento e não precisar mais do conteúdo deles.
Os seguintes comandos removem apenas os arquivos e diretórios criados neste procedimento:
rm -f "$trace_dir/odbc.log" "$config_dir/odbcinst.ini" "$config_dir/odbc.ini"
rmdir "$trace_dir" "$config_dir"
Encontre os arquivos de configuração usados pelo Gerenciador de Drivers
Execute odbcinst -j para exibir os caminhos de configuração do sistema e do usuário. Os caminhos podem variar conforme a plataforma e a build do unixODBC.
DSNs de usuário estão disponíveis para um usuário específico.
DSNs do sistema estão disponíveis para os usuários do sistema, e gerenciá-los pode exigir permissões de administrador. Quando o mesmo nome DSN existe em ambos os arquivos, o DSN do usuário tem precedência. Para saber mais, confira a documentação do unixODBC.