2017-07-15 81 views
1

我正在使用gdbserver來調試遠程進程。我可以在啓動並等待輸入後將gdbserver附加到進程。如何在啓動時將gdbserver附加到進程?

但是,我想在啓動時將gdbserver附加到進程。這個過程是通過一個shell腳本啓動的,我不能改變這個過程是如何啓動的,即我不能修改sh​​ell腳本來通過調用gdbserver來啓動這個過程。

如何在啓動時將gdbserver附加到此進程?

編輯:我可以在main()開始時創建一個等待循環。例如一個循環等待直到它找到一個文件,在預定位置:根據需要,說touch /home/username/CONTINUE退出循環

#include <unistd.h> 
int main() { 

    while(access("/home/username/CONTINUE", F_OK) == -1) 
     sleep(1); 

    /* 
      ...all the rest of main() 
    */ 

    return 0; 
} 

我們可以將gdbserver的,而這個過程是忙於這個循環中,設置斷點。但是這需要我們能夠訪問源代碼,編譯二進制文件並將其放置在目標機器上。我正在尋找比這更好,更簡單的方法。

+0

我相信你在思考_too complicated_ :-D。看看我的答案。 – user0042

+0

你能夠在遠程系統上運行systemtap嗎?如果是這樣,您可以運行Tom Tromey的[preattach](https://github.com/tromey/gdb-helpers/blob/master/gdbhelpers/preattach.stp)以在新流程啓動時立即停止,而無需需要更改任何源代碼。 –

回答

2

但是這需要我們能夠訪問源代碼,編譯二進制文件並將其放在目標機器上。我正在尋找比這更好,更簡單的方法。

它看起來像你正在使用遠程操作系統的Linux/UNIX。

如果您擁有管理員對遠程系統的訪問權限,我能想到的最簡單方法是重命名原始可執行文件,並將其替換爲名爲類似原始可執行文件的shell腳本,該文件現在在gdbserver的控制下重新啓動。

喜歡的東西(假定可執行/usr/bin/foo)在目標機器:

這告訴gdbserver的調試foo_與參數:

root:# cd /usr/bin 
root:# mv foo foo_ 
root:# echo "#!/bin/sh\ngdbserver /dev/com1 foo_ foo.txt" > foo 
root:# chmod a+x foo 

因爲它在gdbserverman(1) page說的foo.txt和 通過/dev/com1與GDB進行通信。 gdbserver現在耐心等待 供主機GDB與之通信。


的另一種方法,而無需修改原有的工藝在所有我能想到的,可能是一個小程序,監視在/dev/proc目錄(IES)的變化,並在與有關的這些事件高度重視gdbserver PID。
雖然運氣很好,但如果gdbserver已附加,那麼在此過程已安排到main()之前。


你應該有存取權限的源代碼反正與gdb合理的調試。儘管有些情況下你也可以使用(dis-)彙編代碼。

相關問題