2012-10-23 13 views
5

Sto usando gdb e alcune librerie condivise. Posso fare in modo che gdb passi alla mia libreria condivisa, ma non a una terza parte.utilizzando gdb di entrare in funzioni 3rd party con le librerie condivise

Quando si utilizza gdb, mi aspetto che "s" (passaggio) passi alla libreria di terze parti e mostri le linee che sta eseguendo all'interno di queste funzioni opj_ * invece di andare alla riga successiva nel mio codice libreria condivisa .

Sono quasi sicuro che mi manca qualcosa durante la compilazione, avendo a che fare con il collegamento (ottenendo gcc per passare alcuni flag di debug a ld), ma non so cosa sia, o qualcosa quando si esegue gdb per dirgli dove sono i simboli di debug.

Ecco i dettagli:

ho i pacchetti di libreria openjpeg, informazioni di debug e devel installati.

# zypper search -si openjpeg 
Loading repository data... 
Reading installed packages... 

S | Name      | Type | Version | Arch | Repository 
--+--------------------------+---------+-----------+--------+----------- 
i | libopenjpeg2_0   | package | 2.0.0-1.4 | x86_64 | packman 
i | libopenjpeg2_0-debuginfo | package | 2.0.0-1.4 | x86_64 | packman 
i | openjpeg2-devel   | package | 2.0.0-1.4 | x86_64 | packman 

# rpm -ql libopenjpeg2_0 
/usr/lib64/libopenjpeg.so.2.0 
/usr/lib64/libopenjpeg.so.2.0.0 

# rpm -ql openjpeg2-devel 
/usr/include/openjpeg-2.0 
/usr/include/openjpeg-2.0/openjpeg.h 
/usr/lib64/libopenjpeg.so 
/usr/lib64/openjpeg-2.0 
/usr/lib64/openjpeg-2.0/OpenJPEGConfig.cmake 
/usr/lib64/openjpeg-2.0/OpenJPEGTargets-release.cmake 
/usr/lib64/openjpeg-2.0/OpenJPEGTargets.cmake 

# rpm -ql libopenjpeg2_0-debuginfo 
/usr/lib/debug 
/usr/lib/debug/.build-id 
/usr/lib/debug/.build-id/85/f8603c75aadee0bd66653332d7ce16d0292752 
/usr/lib/debug/.build-id/85/f8603c75aadee0bd66653332d7ce16d0292752.debug 
/usr/lib/debug/usr/lib64/libopenjpeg.so.2.0.0.debug 

Ho una libreria condivisa libjna_openjpeg legata alla libopenjpeg.

Ho un programma di test "pathtest" legata alla libopenjpeg e libjna_openjpeg

ho compilato ognuno con "gcc -g ..." e anche provato "gcc -ggdb ..."

gcc -ggdb -c -fpic -I/usr/include/openjpeg-2.0 jna_openjpeg.c -lopenjpeg 
gcc -ggdb -shared -o libjna_openjpeg.so jna_openjpeg.o -lopenjpeg 
gcc -ggdb -I/usr/include/openjpeg-2.0 -L. -o pathtest pathtest.c -ljna_openjpeg -lopenjpeg 

un frammento di codice della libreria il mio comune con alcuni commenti rimossi:

opj_stream_t* p_stream = opj_stream_create_default_file_stream(p_file, p_is_read_stream); 

opj_codec_t *p_decompressor = opj_create_decompress(CODEC_J2K); 

// my bug I want to debug is here... this always returns 0 
p_image = opj_decode(p_decompressor, p_stream); 

esecuzione gdb

$ gdp pathtest 

... 

(gdb) s 
52   opj_codec_t *p_decompressor = opj_create_decompress(CODEC_J2K); 
(gdb) s 
59   p_image = opj_decode(p_decompressor, p_stream); 
(gdb) s 

versione gdb

# gdb --version 
GNU gdb (GDB) SUSE (7.3-41.1.2) 
...  
+0

Hai provato a usare 'si' (istruzione passo) invece di' s'? –

+0

si sembra entrare in libopenjpeg, ma non penso che sia utile a quel punto ... Ho bisogno di numeri di riga, nomi di variabili o qualcosa per aiutarmi a capire cosa sta facendo il codice. Quindi penso che gdb manchi delle informazioni di debug ... Voglio sapere come collegarlo al file .so o gdb. Ecco il mio test con "si": http://pastebin.com/yaCBkZr4 – Peter

risposta

1

Non ha dato la versione gdb. Apparentemente questo potrebbe essere un bug in gdb, perché ho avuto lo stesso problema con 7.0.1 ma l'aggiornamento a 7.3.50 lo ha risolto.

5

puoi provare attivando la modalità passo?

(gdb) set step-mode on 

Questo fa sì che il comando passo per fermare alla prima istruzione di una funzione che non contiene le informazioni di debug linea (di solito 3a parte come libc), piuttosto che fare un passo su di esso.

+1

questo ha funzionato per me, grazie. – user13107

Problemi correlati