Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo mostra-lhe como configurar o rastreio do Gestor de Drivers unixODBC no Linux e macOS. O rastreio regista chamadas de API ODBC que efetua através do Gestor de Drivers. Não rastreia os eventos internos do Driver ODBC da Microsoft. Para a diferença entre registos de diagnóstico e camadas de rastreio, veja diagnósticos ODBC.
A secçã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 seguinte.
Guarde os registos de registo de controladores que a sua aplicação exige neste odbcinst.ini ficheiro. A [ODBC] secção é global para a configuração. Adicionar Trace=Yes a uma secção específica do driver não limita o rastreio do Gestor de Drivers do unixODBC a esse driver.
O caminho padrão do ficheiro de rastreamento não está associado à sua aplicação. Utilize em vez disso um diretório privado e um caminho explícito de ficheiro de rastreamento. O rastreamento pode afetar o desempenho, e a saída pode conter dados da aplicação. Restrinja o acesso ao ficheiro e captura apenas as chamadas de que precisares.
Usa uma build unixODBC que inclua a correção upstream do buffer de rastreamento de diagnóstico. Os pacotes do fornecedor podem incluir um backport; verifique os patches do pacote em vez de depender apenas do número de versão. Sem a correção, a aplicação pode abortar em SQLGetDiagRec enquanto o manager formata um erro nativo para rastreio.
Aplicação Trace One
Abre um shell Bash dedicado e depois executa os comandos do shell neste procedimento nessa mesma sessão de terminal. O primeiro comando permite um tratamento de falha imediata, pelo que uma falha na criação de diretórios, na alteração de permissões ou na cópia da configuração interrompe o processo antes do arranque da aplicação. Mantém a shell aberta para os passos seguintes e escreve exit depois da limpeza.
Execute
odbcinst -je anote os caminhos para o controlador do sistema e os ficheiros da origem de dados do sistema. Crie diretórios privados de configuração e rastreio, depois copie os ficheiros de configuração do sistema. Substitua os caminhos de ficheiro de exemplo pelos que sã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 afixada da configuração de rastreio do unixODBC fornece um buffer de 64 bytes ao leitor do perfil de registo. Esse leitor copia em segurança um caminho de até 62 bytes e o seu terminador nulo. Para caminhos mais longos, o seu ramo de truncamento não acrescenta um terminador nulo. Verificações com unixODBC 2.3.14 no Linux e macOS confirmaram a criação correta do rastreio a 62 bytes. O guard conta bytes e para antes de iniciar se o caminho gerado for demasiado longo. Se parar, use um diretório pai gravável mais curto no comando
trace_dir, mantenhamktemp -d, e reinicie o procedimento.Guarde todas as entradas de registo de controladores de que a aplicação necessita no
odbcinst.inicopiado. Se a aplicação usar um nome de fonte de dados do sistema (DSN), mantenha a sua definição na cópiaodbc.ini. Se o valor deDriverfor um nome de registo, mantenha essa definição correspondente noodbcinst.ini. 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 que começa por/é usado como caminho da biblioteca; outros valores são resolvidos através de um registo do driver. Para mais informações, consulte o manual odbc.ini do unixODBC e a implementação fixada da pesquisa de drivers. Os comandos deixam a configuração DSN do utilizador no lugar.Na secção privada
odbcinst.ini, adicione ou atualize a secção global[ODBC]. Utilize o caminho absoluto impresso pelo comando anterior paraTraceFile; não crie uma segunda[ODBC]secção:[ODBC] Trace=Yes TracePid=No TraceFile=/home/myappuser/odbc-trace.ABC123/odbc.logSubstitua o caminho de exemplo pelo caminho exato impresso no passo anterior. Ative
TracePid=Nomesmo que a configuração copiada o permita, para que o rastreio use o ficheiro único mostrado aqui.Inicie a aplicação 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 ficheiro de rastreio deve conter chamadas API ODBC e os seus códigos de retorno. A condicional mantém a shell aberta para limpeza de recursos mesmo que a aplicação saia com um erro. O Gestor de Drivers unixODBC lê o seu diretório de configuração do sistema a partir de
ODBCSYSINI. DefinaODBCINSTINI=odbcinst.inipara este processo filho para que uma sobreposição de nome de ficheiro de registo herdado não contorne o ficheiro copiado. Para a pesquisa do nome do ficheiro, veja a implementação de configuração afixada unixODBC.ODBCSEARCH=ODBC_BOTH_DSNsubstitui um modo de pesquisa DSN herdado apenas para utilizador ou sistema para esta execução. Estas definições mantêm o ficheiro DSN do utilizador existente no local. unixODBC pesquisa ficheiros DSN do sistema e do utilizador, e o DSN do utilizador tem precedência quando o mesmo nome existe em ambos. Verifique se existe um DSN duplicado do utilizador se a aplicação parecer usar definições diferentes do DSN do sistema copiado. Se a aplicação requer intencionalmente um modo de pesquisa restrito, mantenha esse modo e verifique se o ficheiro DSN selecionado contém a definição necessária. Para mais informações, consulte a implementação afixada de search-mode do unixODBC, o manual isql e o manual do odbc.ini.
Quando a execução terminar, saia da aplicação para libertar os seus handles do ambiente ODBC. Defina Trace=No ou remova as [ODBC] definições de rastreamento antes de outro arranque. Restringa o acesso ao registo antes de o inspecionar ou partilhar:
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 sai antes de alocar um ambiente ODBC pode não criar um ficheiro de rastreamento. A verificação reporta o ficheiro em falta e mantém a limpeza acessível no shell dedicado.
Oculte conteúdos sensíveis antes de partilhar o rastreio. Apaga o registo quando já não precisares dele. Remova os ficheiros de configuração privados e diretórios apenas se os criou para este rastreio e já não precisar do seu conteúdo.
Os seguintes comandos removem apenas os ficheiros 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 ficheiros de configuração usados pelo Gestor de Drivers
Execute odbcinst -j para mostrar os caminhos de configuração do sistema e do utilizador. Os caminhos podem variar consoante a plataforma e a construção do unixODBC.
DSNs de utilizador estão disponíveis para um utilizador específico.
Os DSNs do sistema estão disponíveis para os utilizadores no sistema, e a sua gestão pode exigir permissões de administrador. Quando o mesmo nome DSN existe em ambos os ficheiros, a DSN do utilizador tem prioridade. Para mais informações, consulte a documentação do unixODBC.