Skip to the content.

Debugger 的理念,原理和使用

理念

关于 debugger 的理念,我的想法和这篇 blog 完全相同:

I do not use a debugger

如果出现 bug ,你应该想到的是:

而不是使用 debugger 让自己陷入到细节中。

当然也有例外,如果你刚刚接手陌生的一个大项目,debugger 是分析代码流程的好工具。

[ ] gdb 的原理

gdb 的使用

首先强烈推荐 gdb-dashboard

Basic

breakpoints

watch

catch

backtrace

print

例如打印内核中的变量: jiffies

>>> x/xw &jiffies
0xffffffff82807980 <jiffies_64>:        0xfffb6c20
>>> x/xg &jiffies
0xffffffff82807980 <jiffies_64>:        0x00000000fffb6c20

attach

gdb -p PID

thread

signal

info

[ ] gdb script

高级

给定一个虚拟地址,获取其所在源代码地址,一种方法是通过 add2line

➜  test git:(fix-kern) ✗ addr2line -e posted_ipi 0x406aec
/home/maritns3/core/dune/libdune/apic.c:53

但是 gdb 也可以,使用 disassemble 0x406aec 来查看

小技巧

gdb 封装工具

  1. https://www.gdbgui.com/
  2. https://github.com/rohanrhu/gdb-frontend

其他工具

这里列举了 Linux 平台上的各种 debugger,https://scattered-thoughts.net/writing/the-state-of-linux-debuggers/

record debugger

记录下一个程序所有的状态,从而可以切入到任何一个时间点来调试

内存泄露调试技术

代码覆盖率工具

静态检查工具

misc

关键参考

调试 coroutine

原理参考:https://mp.weixin.qq.com/s/R0Ja-0HXdZyNSkpM2Y6Gsg

在 QEMU 中存在对应的脚本,在 gdb 的 cmdline 中使用 help qemu 可以有:

qemu bt -- Display backtrace including coroutine switches
qemu coroutine -- Display coroutine backtrace
qemu handlers -- Display aio handlers
qemu mtree -- Display the memory tree hierarchy
qemu tcg-lock-status -- Display TCG Execution Status
qemu timers -- Display the current QEMU timers

[ ] 配合 coredump 使用

TODO

[ ] 介绍下 coredump 的生成原理

  1. 如果 data type 是一个结构体,而且这个结构体很大,那怎么办 ?  2