2009-03-18 7 views
1

J'ai essayé de suivre les appels de fonction ODBC de mon programme fonctionnant sous Linux. Ce programme lie dynamiquement le gestionnaire ODBC, puis se connecte à la base de données et récupère certaines données.Suivi des appels ODBC pour Informix Client pour Linux

Je peux tracer ODBC appelle avec unixODBC en ajoutant à ODBCINST.INI:

[ODBC] 
Trace=yes 
TraceFile=/tmp/sql.log 

Cette méthode est documentée par IBM: Collecting data for an ODBC Problem

Mais quand je change de gestionnaire de unixODBC à propre gestionnaire de Informix (libifdmr .so), le fichier de trace n'est pas créé. Quelqu'un a-t-il réussi à obtenir la trace ODBC du gestionnaire Informix (et du pilote) sous Linux?

version client: CSDK 3.50UC3

J'espère que ce n'est pas un bug et quelque chose ne va pas avec ma config. Comme pour unixODBC: Je ne peux pas utiliser unixODBC dans une application multithread. J'utilise le pool de connexion et mon application segfaulted lorsque la déconnexion venait d'un autre thread que la connexion. Il est également beaucoup plus lent dans l'application multithread.

+0

Plus d'infos dans ma réponse éditée - mais cela ressemble à un bug, soit dans la TechNote (FAQ) ou dans le produit (ou les deux). –

Répondre

0

J'ai obtenu trace ODBC avec ces paramètres dans mon odbc.ini:

[ODBC] 
TRACE=1 
TRACEFILE=/tmp/odbc_trace.txt 
TRACEDLL=idmrs09a.so 

Je les ai copiés de la version Manuel d'IBM Informix ODBC programmeur 3,50. Ainsi, d'autres documents IBM ne semblent pas valides tant que ces paramètres sont dans odbc.ini au lieu de odbcinst.ini et que vous devez définir TRACEDLL qui n'était pas mentionné dans le document «Collecte de données pour un problème ODBC».

MISE À JOUR: Il semble que IBM a modifié la documentation: il y a des informations sur TRACEDLL, mais odbcinst.ini est resté.

1

Si vous exécutez:

strings $INFORMIXDIR/lib/cli/libifdmr.so | grep _OdbcSetTrace 

obtenez-vous pour voir toutes les références. Sinon, la bibliothèque est sans les fonctions de support. Si vous voyez cela, le mécanisme décrit devrait fonctionner. Si ce n'est pas le cas, vous avez probablement un bug à signaler.

À quel niveau essayez-vous de tracer les problèmes? Et, comme unixODBC fonctionne, pourquoi ne pas utiliser le gestionnaire de pilotes qui fonctionne?


J'ai pris l'exemple de distsel.c $ INFORMIXDIR/demo/cli et compilez sous Solaris 10 à l'aide CSDK 3.50.FC3. Je l'ai eu au point où la connexion réussit, mais la table 'item' est manquante dans la base de données que j'utilise, donc le programme arrête SQLExecDirect(). Quand je l'exécute sous 'truss' (l'équivalent de 'strace' sur Linux), alors je ne vois aucune preuve que le code essaie même d'ouvrir le fichier de trace.

Je compilé en utilisant:

gcc -I$INFORMIXDIR/incl/cli distsel.c -DNO_WIN32 \ 
    -L$INFORMIXDIR/lib/cli -lifdmr -lifcli -o distsel 

J'ai utilisé le .odbc.ini suivant:

; 
; odbc.ini 
; 
[ODBC Data Sources] 
odbc_demo = IDS 11.50.FC3 stores on black 

[ODBC] 
Trace   = yes 
TraceFile  = /tmp/odbc.trace 

[odbc_demo] 
Driver   = /usr/informix/11.50.FC1/lib/cli/libifcli.so 
Description  = IBM Informix CLI 3.50 
Server   = black_19 
FetchBufferSize = 99 
UserName  = jleffler 
Password  = XXXXXXXX 
Database  = stores 
ServerOptions = 
ConnectOptions = 
Options   = 
ReadOnly  = no 

Et celui-ci:

; 
; odbc.ini 
; 
[ODBC Data Sources] 
odbc_demo = IDS 11.50.FC3 stores on black 

[odbc_demo] 
Driver   = /usr/informix/11.50.FC1/lib/cli/libifcli.so 
Description  = IBM Informix CLI 3.50 
Server   = black_19 
FetchBufferSize = 99 
UserName  = jleffler 
Password  = XXXXXXXX 
Database  = stores 
ServerOptions = 
ConnectOptions = 
Options   = 
ReadOnly  = no 
Trace   = yes 
TraceFile  = /tmp/odbc.trace 

Par conséquent, je crois que vous avez trouvé un bug. Je ne suis pas sûr que le bug soit dans la FAQ que vous avez référencé ou dans le produit - je suis enclin à penser à ce dernier. Vous devez signaler le problème au support technique IBM. (Je n'ai pas vérifié le manuel Informix CLI (ODBC), il pourrait être utile de vérifier cela avant d'essayer de générer un bogue produit, si le manuel indique que Trace ne fonctionne pas, et peut-être si cela n'indique pas travail, alors il y a un bogue dans la FAQ que vous avez indiqué)

Si vous cherchez à voir les données SQL, la partie SQLIDEBUG de la FAQ fonctionne:.

SQLIDEBUG=2:distsel ./distsel 

qui a généré un distsel_6004_0_102d40 de fichier moi - ce sera différent pour toi.Vous pouvez ensuite utiliser l'utilitaire 'sqliprint' pour voir les données circulant entre le client et le serveur.

Si vous ne trouvez pas 'sqliprint', revenez me voir.

+0

J'ai trouvé OdbcSetTrace dans libifdmr.so. (plus d'infos dans la question éditée) –

+0

J'utilise déjà SQLIDEBUG et sqliprint. Merci! –

+0

@Jonathan Leffler Je suis capable d'utiliser 'SQLIDEBUG', mais je n'arrive pas à trouver la commande sqliprint – cppcoder