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)
...
Hai provato a usare 'si' (istruzione passo) invece di' s'? –
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