为了更有效地使用NDB来附加并调试进程,以下是一步一步的详细指导。这个过程包括编译带有调试信息的程序、运行程序、找到进程ID、附加到进程、继续执行以及查看堆栈信息等步骤。仅供参考

1、编译带有调试信息的程序

首先,你需要有一个带有调试信息的程序。以下是一个代码示例:

//example.c

  • #include <stdio.h>
    #include <unistd.h>
    int main() {
    for (int i = 0; i < 1000; ++i) {
      printf("HELLO %d\n", i);  
      sleep(1); 
      }
      return 0;
      }

    2、编译并运行这个程序

    命令:g++ -g -o gendb example.c

    命令:./gendb

    输出:
    HELLO 0
    HELLO 1
    HELLO 2

    3、使用NDB附加到进程

    回到你的第一个终端窗口(或者你打开的任何一个新的终端窗口),使用ps命令找到你的程序的进程ID(PID):

    命令:ps aux | grep gendb

    输出:
    geduer 3084 0.0 0.0 28176 12760 pts/1 Tsl+ 09:51 0:00 vim /home/geduer/gendb/example.c
    geduer 3890 0.0 0.0 2252 740 pts/3 S+ 10:14 0:00 ./gendb
    geduer 3988 0.0 0.0 9232 2028 pts/4 S+ 10:14 0:00 grep –color=auto gendb输出将包含你的程序的行,其中包含了进程ID。记录下这个PID。
    然后,使用NDB的-p选项附加到这个进程:

    命令:ps aux|grep gendb

    ndb -p 3890(将替换为你找到的进程ID)

    输出:(节选)
    datapath is /opt/gedu/nanocode/data/DbgCmds.xml
    Cannot open file .
    Connecting (0x0), please wait…
    0807101418E#4156:set PTRACE_SETOPTIONS 0x48 for pid 3890 ret 0, errno 17
    0807101418E#4156:scan region /home/geduer/gendb/gendb, perms: 0x15, type: 0x3 type 0x3
    0807101418E#4156:got module /home/geduer/gendb/gendb
    0807101418E#4156:scan region /home/geduer/gendb/gendb, perms: 0x11, type: 0x1 type 0x1
    0807101418E#4156:scan region /home/geduer/gendb/gendb, perms: 0x13, type: 0x1 type 0x1
    skip module [heap]

    4、在NDB中继续执行

    详情可参考上一篇使用ndb从头调试一个应用程序

    5、查看堆栈信息

    在调试过程中,查看当前堆栈信息是非常有用的。在NDB中,你可以使用k命令(或者NDB可能使用的其他命令,具体取决于其实现)来打印堆栈跟踪:

    命令:k

    输出:
    echo: ‘k’
    0807101518E#4156:readv in 3890, @0x83e0607e70 L8, got 0
    0807101518E#4156:readv in 3890, @0x82e0607e78 L8, got 0
    k
    Child-SP RetAddr Call Site
    0000007fe0607dc8 0000007f894d61fc libc!clock_nanosleep+0x7c [../sysdeps/unix/sysv/linux/clock_nanosleep.c @ 4430]
    0000007fe0607e18 0000007f894e61ec libc!
    nanosleep+0x1c [../sysdeps/unix/sysv/linux/nanosleep.c @ 2330]
    0000007fe0607e48 000000558c9c07fc libc!__sleep+0x4c [../sysdeps/posix/sleep.c @ 4407]
    0000007fe0607e88 00000082e0607e78 gendb!main+0x28 [/home/geduer/gendb/example.c @ 1541]

    6、退出ndb

    完成调试后,你可以退出NDB

    命令:q

    输出:
    echo: ‘q’
    q
    quit:

NDB quits, bye.
命令退出NDB并返回到你的终端
以上内容仅供参考,大家可以一起动手操作

作者:涂滨晶  创建时间:2024-08-06 13:22
最后编辑:涂滨晶  更新时间:2024-08-07 16:18