GDB

Multiple Thread Debugging

1. gdb
2. file "filename"
3. break main
4. run
5. info threads — list all exist thread
6. thread n — switch to thread n
7. debug the thread n

Multiple Process Debugging

1. open gdb to load the multi-process source file

int main()
{
    int a, pid, status;
 
    if ((pid = fork()) < 0)
        printf("fork error");
    else if (!pid) {  /* child */
        sleep(100);
        printf("I dont want to be a zombie");
    }
    else {
        printf("I dont want to be a orphaned");
        waitpid(pid, &status, 0);
    }
    return 0;
}

2. run — this gdb will execute the parent process, and the process will stop on waitpid()
3. open another terminal, and type: shell ps -aef|grep "filename" — check the pid of the child process
4. run gdb in new terminal
5. attach "child_pid"
6. return — return from the sleep() function
7. start to trace the child process's code

Remote Debugging

若要進行遠端除錯,我們需要編譯在 target 端執行的 gdbserver (add in the root file system for target) 以及在 host 端控制 gdbserver 的 gdb ,因為 gdbserver 的程式較原來的 gdb 簡單,因此通常 gdbserver 會比 gdb 本身還要容易 port 到 target 上去,但是在使用上又和原本的 gdb 相同。

要進行遠端除錯的步驟如下:

1) 在 target 端用 gdbserver 開啟要除錯的程式,並監聽某一個 port ,等待 host 端的 gdb 連線進來。

進行此步驟前,請先用 QEMU 載入 linux kernel ,並切換到 gdbserver 和 bug 所在的目錄,就可以鍵入

./gdbserver 192.168.0.1:5566 bug

Note
192.168.0.1 是 host 端的 IP
5566 是 gdbserver 監聽的 port
bug 是要偵錯的程式

2) 從 host 端連到 target 進行 debug

在 host 端也用 gdb 執行同一個程式,在此還需要引入程式的理由是因為 gdbserver 只負責控制程式,但關於程式碼的內容等和程式執行本身的資訊還是由 gdb 自己負責。

首先,先用 gdb 引入 bug

arm-linux-uclibc-gdb bug

接著,連線到 target 端

target remote 192.168.0.2:5566
即可進行 debug 。

Note
192.168.0.2 是 target 端的 IP
5566 是 gdbserver 監聽的 port

References

http://www.cmlab.csie.ntu.edu.tw/~daniel/linux/gdb.html
http://sothat.bsdx.org/mirror/open_source/x1246.html

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License