主要观点:本周了解到 WinDbg 有时间旅行调试器(TTD),此工具可向前向后自由移动,能帮助找出程序进入坏状态的原因,如在多线程程序中找出内存被篡改或调用栈被破坏的原因。
关键信息:
- 可通过安装 WinDbg、时间旅行调试器文档、CppCon 2017 演示了解相关内容。
- TTD 可在指令级别工作,无需插装且在多线程时也具有确定性。
- 举例说明在两个线程程序中,通过设置内存事件和“旅行到位置”等操作可找到导致问题的代码行和调用栈。
重要细节: - 如在两个线程函数
reader_thread
和stomper_thread
中,stomper_thread
可能会将随机指针改为0xbadf00d
导致reader_thread
出错,通过 WinDbg TTD 可找到具体修改该内存地址的代码行。 - 另一个例子中故意破坏调用栈,通过向后步进可找到正确的调用栈。
- 但使用 WinDbg TTD 有性能损失(5 到 20 倍)和生成大的跟踪文件(每秒约千兆字节)的缺点,可附加到运行中的进程。目前仅用于调试简单示例,不确定在“真实程序”中生成的数据量是否有用,Valgrind 等类似工具可能也能发现这些问题,但 TTD 能找出复杂状态问题的根源。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。