Missmiaom
2/9/2020 - 2:52 AM

gdb

gdb

暂停程序

断点

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

# 添加 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

根据 dmesg 查看崩溃堆栈

[ 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