2012-05-07 42 views
3

我在我的程序中使用了一個庫(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

+0

嘗試['valgrind'](http://valgrind.org/docs/manual/quick-start.html)。 – ArjunShankar

+0

該錯誤不需要在libpcap中(並且可能不是 - 'select'並沒有被破壞,所有這一切)如果你的程序碰巧在圖書館使用的內存上,這可能是結果 – Thomas

+0

我從不真正su specp libpcap本身。問題是,我怎麼知道我做錯了什麼導致了問題。 @ArjunShankar我從來沒有使用valgrind,但其輸出的這部分可能是相關的:http://pastebin.com/93gkSScS – Elektito

回答

3

的Valgrind的輸出顯示,libpcap(從內側nids_run)試圖讀取存儲器位置後nids_exitfreeš它們:

如:

==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級BL ock,即free d在nids_exit中,隨後在nids_run(顯然還沒有停止)內部讀取。

所有其他錯誤是相似的(nids_exitfree SA塊,並nids_run繼續嘗試使用它

這意味着:你要麼不使用libnids(nids_run/nids_exit)正確,或有在libnids中的一個錯誤

+0

它似乎是libnids中的一個錯誤。我創建了一個修補程序,似乎解決了這個問題。我在等待作者發表評論,然後將其標記爲答案,儘管我確信這在任何情況下都是正確答案(除非有人提出更完整的東西)。謝謝。 – Elektito

+0

@Homayoon - 爲了好奇,你會分享一個補丁的鏈接嗎?我下載了libnids的源碼,但還沒有看過它。 – ArjunShankar

+0

當然。這裏是:http://pastebin.com/GVrUbRmh。我不太確定這是否是正確的做法,雖然它似乎解決了我的問題。即使它是正確的,爲了使事情完全正確,可能還有很多事情要做,但我會把它留給作者。我一直在使用libnids一兩個月,而忽略這個問題,它似乎是一段很好的代碼。 – Elektito