【问题标题】:how to set a breakpoint malloc_error_break lldb如何设置断点 malloc_error_break lldb
【发布时间】:2021-05-27 17:26:18
【问题描述】:

当我运行我的程序时,我有这个错误:

a.out(56815,0x10bb2c5c0) malloc: *** 对象 0x7fe5ea402a90 错误:未分配指针被释放 a.out(56815,0x10bb2c5c0) malloc: *** 在 malloc_error_break 中设置断点进行调试

如何使用 lldb 为 malloc_error_break 设置断点?

感谢您的帮助

【问题讨论】:

  • 调试malloc可能意义不大……这个bug的根源就在你程序的某个地方。我的直觉告诉我,它会出现在你用指针做奇怪和/或不必要的复杂事情的地方。

标签: c debugging malloc breakpoints lldb


【解决方案1】:
(lldb) break set -n malloc_error_break

是通过符号名设置断点的lldb命令。

该断点将在错误释放发生的点停止您,这是一些信息。例如,您可能有一个代码路径,您没有初始化稍后释放的东西。当你点击 malloc_error_break 时的回溯会告诉你你想要释放什么,所以你可以追溯为什么它没有被初始化。

如果问题最终变得更加复杂(例如双重释放),那么从停止点开始追踪就会有点困难,因为您无法从那里分辨出第一个释放在哪里。在这种情况下,绝对值得在启用 ASAN 的情况下重建程序并在调试器中再次运行它。在双重释放等情况下,由于 ASAN 记录了程序的整个 malloc 历史,它可以告诉您每次 malloc 系统处理错误指针的时间,从而更容易发现错误。它还进行大量的飞行前检查,并且通常可以及早发现内存错误。并且性能成本低得惊人......

这里有更多关于 ASAN 的信息:

https://clang.llvm.org/docs/AddressSanitizer.html

如果使用 ASAN 重建太困难,您可以使用 MallocStackLoggingNoCompact 环境变量,然后使用 malloc_history 程序打印错误。在“malloc”手册页中有更多信息,例如:

https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/malloc.3.html

但是,如果您打算做的不仅仅是一点点开发,那么熟悉 ASAN 是个好主意。它使跟踪分配和解除分配错误变得更加容易。

【讨论】:

  • 如果您使用的是 linux 系统,那么古老的 valgrind 是 ASAN 的另一个不错的替代品。它不需要重新编译,但设置起来有点困难。
猜你喜欢
  • 2015-05-05
  • 2012-12-12
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2019-12-18
  • 2018-01-09
  • 1970-01-01
  • 2011-02-19
相关资源
最近更新 更多