vscode 通过数据断点分析segmentation fault

debug

通常地,程序异常,我们借助vscode在ubuntu主动调试,程序会自动在异常代码位置停下来,但是异常分析通常不会这么简单,而是一连串连锁反应。

这里尝试分析,因为程序异常,非法写入了一段正常内存,从而导致多个链路之后异常发生。而对于此问题,最常使用的调试手段就是添加数据断点。

通常直接在某段代码位置添加的代码为函数断点,程序会自动在该位置停下来。同样地,我们可以添加条件断点:

  • 当某个判断条件(例如,变量值为真)满足的时候;
  • 当某段代码连续执行N次的时候;
  • 当某个变量(内存)被读写的时候;

如上前两个条件断点,vsocde 里面的c/c++ extension 已经支持,可以在ide里面点击断点(红色小点)直接编辑,但是最后一个为数据断点还不支持。

提示:vscode 断点更多信息参考https://code.visualstudio.com/docs/editor/debugging#_advanced-breakpoint-topics

需要借助debug console 键入gdb(gnu debugger)命令,

images

如上操作,成功初始化device_scan_ 成员变量后,程序不再会对变量进行写操作,但是之后该对象的一个成员变量值被异常写入了非法值,当再次用该对象指针打印日志函数时候发生异常。

此时通过p命令查看变量并获取变量首地址。

-exec p device_scan_       #打印变量
-exec p &device_scan_.data #获取变量地址

通过watch命令监控该地址的写操作。

-exec watch *0x9ac920      #监控变量写操作
提示:如上pwatch命令可以参考gdb手册,https://sourceware.org/gdb/current/onlinedocs/gdb/Set-Watchpoints.html#Set-Watchpoints。同时可以通过awatch监控读写,rwatch监控写操作。

之后全速运行,发现程序在另外一个非法访问该变量位置停了下来,并且通过 Old ValueNew Value提示了值变化。

异常

通过分析上下文就可以定位到引发异常的真正原因。


本文由 Jay 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处,点赞13

还不快抢沙发

添加新评论