4

プログラムでライブラリ (libnids) を使用しています。ライブラリから関数 nids_run を呼び出します。ライブラリは、明示的に nids_exit を呼び出すまで実行を続けます。

私のプログラムは SIGINT を処理し、nids_exit を呼び出します。割り込みハンドラは正常に戻りますが、ライブラリが制御をプログラムに戻す前に、segfault を受け取ることがあります。これは、GDB が提供するバックトレースです。

#0  0x00007ffff6498b2a in ?? () from /usr/lib/libpcap.so.1
#1  0x00007ffff649bee1 in pcap_loop () from /usr/lib/libpcap.so.1
#2  0x00007ffff77bae66 in nids_run () from /usr/lib/libnids.so.1.24
#3  0x0000000000401e92 in main (argc=3, argv=0x7fffffffebf8) at eve.c:139

問題を見つけるための最善の戦略は何ですか? どうにかして libpcap をデバッグする必要がありますか?

更新: ArjunShankar が提案したように、Valgrind でプログラムを実行しました。これは出力の一部です:

==7504== Invalid read of size 4
==7504==    at 0x654EDC1: ??? (in /usr/lib/libpcap.so.1.2.1)
==7504==    by 0x6551EE0: pcap_loop (in /usr/lib/libpcap.so.1.2.1)
==7504==    by 0x5250E65: nids_run (in /usr/lib/libnids.so.1.24)
==7504==    by 0x401E91: main (eve.c:139)
==7504==  Address 0x70eece8 is 40 bytes inside a block of size 768 free'd
==7504==    at 0x4C29A9E: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7504==    by 0x5250DEB: nids_exit (in /usr/lib/libnids.so.1.24)
==7504==    by 0x4026D0: signal_handler (signalhandling.c:17)
==7504==    by 0x5B6313F: ??? (in /lib/libpthread-2.15.so)
==7504==    by 0x5B5FC60: pthread_cond_timedwait@@GLIBC_2.3.2 (in /lib/libpthread-2.15.so)
==7504==    by 0x58E37D4: g_cond_wait_until (in /usr/lib/libglib-2.0.so.0.3200.1)
==7504==    by 0x587E2C0: ??? (in /usr/lib/libglib-2.0.so.0.3200.1)
==7504==    by 0x587E909: g_async_queue_timeout_pop (in /usr/lib/libglib-2.0.so.0.3200.1)
==7504==    by 0x4022D2: analyzer_thread_func (analyzers.c:93)
==7504==    by 0x58CA0C4: ??? (in /usr/lib/libglib-2.0.so.0.3200.1)
==7504==    by 0x5B5BE0D: start_thread (in /lib/libpthread-2.15.so)

出力の詳細は、http: //pastebin.com/93gkSScSにあります。

4

1 に答える 1

3

Valgrind の出力は、libpcap(内部から) s のnids_run後にメモリ位置を読み取ろうとすることを示しています。nids_exit free

例えば:

==7504== Invalid read of size 4
==7504==    at 0x654EDC1: ??? (in /usr/lib/libpcap.so.1.2.1)
==7504==    by 0x6551EE0: pcap_loop (in /usr/lib/libpcap.so.1.2.1)
==7504==    by 0x5250E65: nids_run (in /usr/lib/libnids.so.1.24)

Address 0x70eece8 is 40 bytes inside a block of size 768 free'd
==7504==    at 0x4C29A9E: free
==7504==    by 0x5250DEB: nids_exit (in /usr/lib/libnids.so.1.24)

つまり、これは 768 サイズのブロックであり、freed innids_exitであり、その後内部で読み取られますnids_run(明らかにまだ停止していません)。

他のすべてのエラーは同様です ( nids_exit freesa ブロックであり、nids_run引き続き使用を試みます。

これが意味することは、libnid ( nids_run/ nids_exit) を正しく使用していないか、 にバグがあるということですlibnids

于 2012-05-07T09:45:22.563 に答える