2013-02-18 264 views
1

我試圖用gdb來調試一個C程序,它一切正常,直到我將一個指針傳遞給一個函數(第三方庫),之後gdb失去焦點並且程序運行時沒有在我的回調函數中擊中了我的斷點。使用gdb調試回調

例如我從libpcap庫調用pcap_loop庫,它需要一個指向我的回調函數got_packet的指針。

pcap_loop(handle, num_packets, got_packet, NULL); 

,只要我在或通過與gdb我的破發點這條線在got_packet步驟是從來沒有擊中。
爲什麼?
任何想法?

+3

確定它確實被調用? – alk 2013-02-18 16:35:53

+2

我同意alk。在'got_packet'本身設置一個斷點,看它是否真的被調用。 – 2013-02-18 16:46:56

+0

你可能正在聽錯誤的接口,這就是爲什麼你沒有得到任何數據包.. – iabdalkader 2013-02-18 16:50:42

回答

1

在某些情況下可以跳過GDB斷點,特別是在調試啓用了優化的編譯代碼時,但最可能的答案是庫函數沒有達到您期望的效果。

GDB無法將轉換爲沒有調試信息的庫,因此相反,它只是顯示爲「失去焦點」,正如您所說的那樣,在返回點上設置臨時斷點並等待函數完成。這仍然不應該停止觸發回調中的斷點。

如果您使用的是來自操作系統信息庫的庫,那麼您可能會發現可以安裝「調試」程序包。這可以讓你進入庫代碼,並可能找出問題所在。

然而,調試printf通常要簡單得多,或者以某種方式「破壞」got_packet函數,這會導致一個信號(*(int *)0 = 1),並以這種方式滿足您自己是否被調用。

如果你能證明函數真的被調用,並且GDB確實沒有捕獲到斷點,那麼你有一個GDB錯誤(或者可能是內核錯誤)。

+0

GDB *可以*進入沒有調試信息的庫中,但需要使用'stepi'來做到這一點。 – 2013-02-18 21:07:34

+0

@EmployedRussian:好吧,那是真的,但是在你有用之前,你很可能必須長時間地走下去。 – ams 2013-02-19 09:58:14

+0

感謝ams,我最終按照你的建議去做了,並將printf添加到傳遞給libpcap的回調函數中,這確認了我的函數指針被libpacp成功調用,但從未觸及gdb中設置的斷點。我試着用你提出的使用調試信息編譯的libpcap版本,看看這個問題是否解決了這個問題,但是正如你所建議的那樣,當我的函數在沒有調試信息的情況下從一個庫中調用時,我仍然會期待斷點的命中。無論如何,高興地接受你回答:-),非常感謝。 – Vivilar 2013-02-19 11:51:51