2016-12-30 74 views
1

有時一個Linux守護進程守護程序我用C寫獲取這些錯誤消息:調試用C語言編寫

[Fri Dec 30 07:58:54 2016] listend[13944]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13948]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13949]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13950]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13951]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13952]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13953]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13954]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13955]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

我的問題是我怎麼能檢查libc-2.19.so該地址,看看哪些功能在錯誤發生時被調用?我試着用gdb

,但我得到:

$ gdb code/listen/i686-Linux/listend 
. 
. 
(gdb) info addr 0xb7575000 
No symbol "0xb7575000" in current context. 
(gdb) info addr 0xb771c000 
No symbol "0xb771c000" in current context. 
+4

在['valgrind'](http://valgrind.org)下運行你的守護進程。這個bug幾乎肯定不在libc中; valgrind會在您的code_中顯示觸發_first_無效內存訪問的點。這可能不是問題的根源,但它通常比現在更接近根本原因。 – zwol

+0

對,我想如果我能找到libc中哪個函數指向的地址,我可以將其追溯到我的代碼中。我知道100%我的代碼有錯誤,而不是libc ;-) –

+3

它也有助於編譯你的代碼而無需優化,並使用調試符號:'gcc -O0 -g ...'。這將改善gdb和valgrind的輸出。 –

回答

1

與您提供有可以在這裏完成,使您的問題診斷非常小的數據。我可以推斷出地址是0,指向代碼中的NULL取消引用(您將NULL作爲指向字符串地址的指針或類似的東西,從而使得printf()調用失敗---或類似的情況再次發生)地址0x1a7000是在libc中引發異常的地方。您可能可以通過對您的libc.so.xx.xx.xx執行nm(1)來猜測函數名稱。轉儲核心(通過在執行守護進程之前設置ulimit -c unlimited)將允許使用postmortem調試器。或者守護進程的源代碼也可能有幫助。對不起,但你的問題遠遠不能完成,以幫助。有關更多信息,請參見How to create a Minimal, Complete, and Verifiable example

+0

這就是我正在尋找的答案:您可能可以通過對您的libc.so.xx.xx.xx執行nm(1)來猜測函數名稱。謝謝! –

+0

如果這是您正在尋找的答案,請將它標記爲這樣! :))你會得到一個真正的答案與驗屍核心圖像和gdb調試器也。 –

+0

它間歇性地拋出了這個錯誤,我一直在監視幾天,有時幾個星期試圖抓住它。 –