vscode 通过数据断点分析segmentation fault
通常地,程序异常,我们借助vscode在ubuntu主动调试,程序会自动在异常代码位置停下来,但是异常分析通常不会这么简单,而是一连串连锁反应。
这里尝试分析,因为程序异常,非法写入了一段正常内存,从而导致多个链路之后异常发生。而对于此问题,最常使用的调试手段就是添加数据断点。
通常直接在某段代码位置添加的代码为函数断点,程序会自动在该位置停下来。同样地,我们可以添加条件断点:
- 当某个判断条件(例如,变量值为真)满足的时候;
- 当某段代码连续执行N次的时候;
- 当某个变量(内存)被读写的时候;
如上前两个条件断点,vsocde 里面的c/c++ extension 已经支持,可以在ide里面点击断点(红色小点)直接编辑,但是最后一个为数据断点还不支持。
提示:vscode 断点更多信息参考https://code.visualstudio.com/docs/editor/debugging#_advanced-breakpoint-topics。
需要借助debug console 键入gdb(gnu debugger)命令,
如上操作,成功初始化device_scan_
成员变量后,程序不再会对变量进行写操作,但是之后该对象的一个成员变量值被异常写入了非法值,当再次用该对象指针打印日志函数时候发生异常。
此时通过p
命令查看变量并获取变量首地址。
-exec p device_scan_ #打印变量
-exec p &device_scan_.data #获取变量地址
通过watch命令监控该地址的写操作。
-exec watch *0x9ac920 #监控变量写操作
提示:如上p
、watch
命令可以参考gdb手册,https://sourceware.org/gdb/current/onlinedocs/gdb/Set-Watchpoints.html#Set-Watchpoints。同时可以通过awatch
监控读写,rwatch
监控写操作。
之后全速运行,发现程序在另外一个非法访问该变量位置停了下来,并且通过 Old Value
和New Value
提示了值变化。
通过分析上下文就可以定位到引发异常的真正原因。
还不快抢沙发