下面,我将提供一个使用ndb来从头调试一个程序的基本文档,包括设置断点、运行和查看调试过程的步骤,仅供参考
代码展示:(代码名为gendb1.c,保存于gendb文件中)
#include <stdio.h>
#include <unistd.h>
int main()
{
for (int i = 0; i < 10; ++i)
{
printf(“Hello %d\n”, i);
sleep(1);
}
return 0;
}
1、 准备你的程序
首先,我们需要一个带有调试信息的可执行文件。使用g++编译器并添加-g选项来编译你的源代码,这样NDB就能访问到源代码级别的调试信息。
命令:g++ -g -o gendb gendb1.c
2、 使用ndb调试
接下来,使用NDB来启动你的程序。
命令:ndb ./gendb
输出:(节选)
datapath is /opt/gedu/nanocode/data/DbgCmds.xml
Cannot open file .
Connecting (0x0), please wait…
0805104651E#6071:New Thread 6074 is created
0805104651E#6071:waitpid on newly process 6074 got 0x57f�� signaled pid 6074
0805104651E#6071:set PTRACE_SETOPTIONS 0x48 for pid 6074 ret 0, errno 17
Connecting (0x8), please wait…
0805104652E#6071:scan region /home/geduer/gendb/gendb, perms: 0x15, type: 0x3 type 0x3
0805104652E#6071:got module /home/geduer/gendb/gendb
0805104652E#6071:scan region /home/geduer/gendb/gendb, perms: 0x13, type: 0x1 type 0x1
0805104652E#6071:scan region /usr/lib/aarch64-linux-gnu/ld-linux-aarch64.so.1, perms: 0x15, type: 0x1 type 0x1
0805104652E#6071:got module /usr/lib/aarch64-linux-gnu/ld-linux-aarch64.so.1
通过输入ndb命令加上你的程序名(在这个例子中是./gendb),你可以启动NDB并进入其命令行界面。
3、设置断点
在程序的关键位置设置断点,以便在程序执行到这些位置时暂停,从而允许您检查变量的值、调用栈等信息。使用bp命令在main函数的开始处设置断点。
命令:bp gendb!main
输出:
echo: ‘bp gendb!main’
bp gendb!main
4、查看断点
通过bl命令,您可以查看当前设置的所有断点及其详细信息。这有助于确认断点是否正确设置,以及了解断点的具体位置和状态。
命令:bl
输出:
echo: ‘bl’
bl
0 e 00000055`865407d4 0001 (0001) 0:|gendb!main
列出了当前所有的断点及其详细信息。
5、运行程序
现在,开始运行程序,程序将在第一个断点处暂停
命令:g
输出:
echo: ‘g’
g
BUSY(0x1), enter ‘b’ to breakin…
0805104655E#6071:[rbp] set pc of thread 6074 from 7f7fa94370 to 7f7fa94374
0805104655E#6071:[rbp] set pc of thread 6074 from 7f7fa94374 to 7f7fa94370
0805104655E#6071:[ibp]fail to eat step out signal for thread 6074 1th time
0805104655E#6071:[rbp] set pc of thread 6074 from 7f7fa94370 to 7f7fa94374
0805104655E#6071:[rbp] set pc of thread 6074 from 7f7fa94374 to 7f7fa94370
0805104655E#6071:[ibp]failed to read name @0x7f7fad3930 or null name. ret 0, read 256
0805104655E#6071:[ibp]fail to eat step out signal for thread 6074 1th time
0805104655E#6071:[ufzt]bad condition on thread 6074, suspend_cnt=0, state 0x4
Hello 0
Hello 1
Hello 2
g命令开始执行程序,直到遇到第一个断点或程序正常结束
6、使用b+Enter暂停程序
这表示程序因为接收到SIGINT信号而被中断。
命令:b+Enter
输出:
Sending breakin, 38
0805104721E#6071:[uevt]transfer kill signal to signle step
Break-in sent, waiting 30 seconds…
(17ba.17ba): Single step exception - code 80000004 (first chance)
This is the first round of exception dispatching. The exception might be expected.
7、使用命令k查看堆栈信息
展示在程序执行过程中,从当前执行点向上回溯到程序入口点的函数调用序列
命令:k
输出:
echo: ‘k’
0805104736E#6071:readv in 6074, @0x83cef2a5f0 L8, got 0
0805104736E#6071:readv in 6074, @0x82cef2a5f8 L8, got 0
k
Child-SP RetAddr Call Site
0000007fcef2a548 0000007f
7f9761fc libc!clock_nanosleep+0x7c [../sysdeps/unix/sysv/linux/clock_nanosleep.c @ 4430]
0000007fcef2a598 0000007f
7f9861ec libc!nanosleep+0x1c [../sysdeps/unix/sysv/linux/nanosleep.c @ 2330]
0000007fcef2a5c8 00000055
865407fc libc!__sleep+0x4c [../sysdeps/posix/sleep.c @ 4407]
0000007fcef2a608 00000082
cef2a5f8 gendb!main+0x28 [/home/geduer/gendb/gendb1.c @ 1541]
8、退出ndb
完成调试后,你可以退出NDB
命令:q
输出:
echo: ‘q’
q
quit:
NDB quits, bye.
命令退出NDB并返回到你的终端
最后编辑:涂滨晶 更新时间:2024-08-07 16:18