我在我的程序中使用了一個庫(libnids)。我從庫中調用函數nids_run繼續運行,直到我明確調用nids_exit。共享庫中的Segfault。如何調試?
我的程序處理SIGINT並調用nids_exit。中斷處理程序正常返回,但有時在庫將控制權返回給我的程序之前,我收到段錯誤。這是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: [email protected]@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
嘗試['valgrind'](http://valgrind.org/docs/manual/quick-start.html)。 – ArjunShankar
該錯誤不需要在libpcap中(並且可能不是 - 'select'並沒有被破壞,所有這一切)如果你的程序碰巧在圖書館使用的內存上,這可能是結果 – Thomas
我從不真正su specp libpcap本身。問題是,我怎麼知道我做錯了什麼導致了問題。 @ArjunShankar我從來沒有使用valgrind,但其輸出的這部分可能是相關的:http://pastebin.com/93gkSScS – Elektito