b <line-number>
b <function>
info b [n]
条件断点:
b <line-number> if <expression> # 创建条件断点
condition <N> <expression> # 设置断点N的触发条件为expression
ignore <N> <count> # 忽略断点N的停止N次
删除断点:
delete breakpoint 1 # 删除断点1
watch <expr>
rwatch <expr>
info watchpoints
catch <events>
有以下可捕捉的事件:
set scheduler-locking off
不锁定任何线程,也就是所有线程都执行,这是默认值set scheduler-locking on
只有当前被调试程序会执行set scheduler-locking on step
在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行# 添加 so 目录
set solib-search-path <lib-path>
# 显示 so 库加载情况
info sharedlibrary
# 添加源码目录
dir xxx
set follow-fork-mode child
查看当前栈顶反汇编:
disas
查看寄存器的值:
i register <x0>
关键函数在于: __cxxabiv1::__cxa_allocate_exception
该函数作用为为异常分配内存
b eh_alloc.cc:101 if thrown_size == 8
因为 std::exception 在 linux 下占8个字节,所以此方法只能捕捉std::exception及其派生类。
size_t a = sizeof(std::exception); // 8
size_t b = sizeof(std::bad_weak_ptr); // 8
[ 6807.501481] a.out[72684]: segfault at 0 ip 00007f6559bc7463 sp 00007fff80625b18 error 6 in libc-2.17.so[7f6559a7c000+1b6000]
# 14b463 = 00007f6559bc7463 - 7f6559a7c000+1b6000
addr2line -j .text -e libtst.so 0x14b463