2009-11-06 52 views
3

我的問題是關於使用gdb/gdbserver在嵌入式arm處理器上遠程調試應用程序。使用gdb/gdbserver遠程調試共享庫

我可以調試應用程序本身,但應用程序動態鏈接到實現內部通信協議的共享庫。我希望能夠在共享庫函數中設置斷點,以便找出一些設備發現問題。

我確定該庫是使用調試符號編譯的,並在主機端由gdb加載,我可以在庫中列出函數,甚至設置斷點,但只要我嘗試運行我得到的應用程序一個錯誤消息到該效果:

Cannot insert breakpoint X.
Error accessing memory address : Input/output error.

其中X是斷點數目在gdb和是地址遠小是有效的。
我在目標主機和主機上都使用了新庫,但是通過nfs mount上的目標上的mount -o bind newlib oldlib
有沒有人有什麼可能是錯的想法? 在此先感謝。

+0

[與gdbserver的調試共享庫]的可能的複製(https://stackoverflow.com/questions/8611194/debugging-shared-libraries-with-gdbserver) – 2017-10-08 07:56:11

回答

0

瘋狂猜測:您將共享庫加載到主機GDB的地址不正確。

而不是明確地加載到GDB,使用"set stop-on-solib-event on",等待獲得加載庫(info shared會告訴你加載庫的當前目錄),並然後設置的斷點。

0

使用下面的命令來設置掛起的斷點,將得到解決共享對象庫加載

set breakpoint pending on 

後,不幸的是,你不能使用「設置止損上solib事件上的」 gdbserver的遠程調試因爲gdbserver不識別/發送solib事件。我必須發出一個solib-search-path或set sysroot命令來讓gdb在main上打斷點後加載所有的共享庫符號。

6

我看到這個問題是從2009年,但目前的答案是外的日期,所以這裏的更新:

@Employed俄羅斯認爲,必須使用stop-on-solib-event。這不再是事實; NDK r8d支持尚未加載的solib中的掛起斷點。

@Brent Piddy說stop-on-solib-event不適用於gdbserver。至少r8c,這也不再是真實的。我的公司有一款產品依賴於GDB的這種NDK行爲,如果沒有它,我們將面臨很大的麻煩。