【c++】gdb调试

参考

基本调试命令

命令简写形式说明
listl查看源码
backtracebt, where打印函数栈信息
nextn执行下一行
steps一次执行一行,遇到函数会进入
finish运行到函数结束
continuec继续运行直到断点, (同时可以指定跳过当前断点的命中次数, 例如: continue 8)
breakb设置断点(可以直接指定函数名,或者文件加行数, 例如: b test_function, b demo.cpp:16)
info breakpoints显示断点信息
deleted删除断点
printp打印表达式的值
runr启动程序
untilu执行到指定行
infoi显示信息, 例如查看断点信息: info breakpoints
ignore 1 5忽略1号断点5次, 断点编号,可以通过info breakpoints
p blockNum打印数据
layout src显示源码
helph帮助信息

调试

$ ps -ef |grep .*gauss.*
xxx   298366 255537  1 02:18 pts/1    00:00:25 gaussdb -D /home/xxx/db --single_node -p 28922
// 通过进程名查看需要跟踪的进程ID

$ gdb attach 298366

(gdb) b hnswinsert_internal
Function "hnswinsert_internal" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (hnswinsert_internal) pending.
// 利用函数名建立断点,如果函数名在共享库中,不能被加载到,可以选择pending

(gdb) info b
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   <PENDING>  hnswinsert_internal
// 查看断点信息

(gdb) c
Continuing.
Program received signal SIGUSR2, User defined signal 2.
[Switching to Thread 0x7f4517bfb700 (LWP 298386)]
0x00007f4612514ddd in poll () from /usr/lib64/libc.so.6
// 可以发现,执行c(continue)之后并没有停止在断点,这是因为被其它信号中断了,例如上面的信号`SIGUSR2`
// 可以执行下面的命令来忽视这些特定的信号,例如忽视`SIGUSR2`

(gdb) handle SIGUSR2 nostop noprint pass
Signal        Stop	Print	Pass to program	Description
SIGUSR2       No	No	Yes		User defined signal 2

(gdb) c
Continuing.
[New Thread 0x7fd2425ef700 (LWP 303881)]
[Thread 0x7fd2425ef700 (LWP 303881) exited]
[New Thread 0x7fd2425ef700 (LWP 303882)]
[Thread 0x7fd2425ef700 (LWP 303882) exited]
[New Thread 0x7fd2425ef700 (LWP 303893)]
[Switching to Thread 0x7fd2425ef700 (LWP 303893)]

Breakpoint 1, hnswinsert_internal (index=0x7fd23f1aa2b0, values=0x7fd2425bae20, isnull=0x7fd2425bad90, 
    heap_tid=0x7fd23fdc8068, heap=0x7fd23f1acee8, checkUnique=UNIQUE_CHECK_NO) at src/hnswinsert.cpp:815
815	{
// 可以发现,忽视其它中断信号后,执行`c`可以直接到达预设的断点处

(gdb) c
Continuing.
[New Thread 0x7fd23e993700 (LWP 304442)]

Breakpoint 1, hnswinsert_internal (index=0x7fd23f1aa2b0, values=0x7fd2425bae20, isnull=0x7fd2425bad90, 
    heap_tid=0x7fd23fdc8068, heap=0x7fd23f1acee8, checkUnique=UNIQUE_CHECK_NO) at src/hnswinsert.cpp:815
815	{
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00007fd23e9b8cff in hnswinsert_internal(RelationData*, unsigned long*, bool*, ItemPointerData*, RelationData*, IndexUniqueCheck) at src/hnswinsert.cpp:815
	breakpoint already hit 2 times
// 查看断点信息,并可以看到断点已经命中的次数

(gdb) ignore 1 1830
Will ignore next 1830 crossings of breakpoint 1.
// 如果断点在循环中, 需要被大量重复执行, 如果我们只需要查看其中某一次,例如1831次的情况,可以利用`ignore`来忽视前面`1380`次
// 的断点

(gdb) c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ystraw_ah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值