【问题标题】:Clang runtime checks: print backtraceClang 运行时检查:打印回溯
【发布时间】:2013-11-01 12:45:21
【问题描述】:

Clang 编译器提供了许多有用的运行时检查,例如-fsanitize=unsigned-integer-overflow。当其中一项检查失败时,我可以打印回溯(例如使用 gdb)吗?目前我得到了问题的确切位置,但我没有上下文。如何从这些运行时检查,尤其是回溯?

【问题讨论】:

    标签: c++ c runtime clang ubsan


    【解决方案1】:

    不需要启用致命错误的更简单的解决方案是设置 env.变量UBSAN_OPTIONS=print_stacktrace=1

    【讨论】:

      【解决方案2】:

      可以使用这些标志中止程序:

      -fsanitize=undefined-trap -fsanitize-undefined-trap-on-error -ftrap-function=abort
      

      最后一个选项导致调用中止;您可以在 GDB 下运行程序并在程序中止后打印回溯。

      来源 - answer to "Will any programs detect a buffer overflow within a C/C++ structure?"

      【讨论】:

      • 使用 abort 对于大型应用程序可能效率很低,因为您会显着增加修复单个错误的延迟(您必须为每个错误经历漫长的检测-修复-重建-部署-测试周期)。
      • 但在 GDB 中,您可以向上调用堆栈以中止,finish 函数和 signal 0 继续。也就是说,如果您在这个阶段发现代码中有很多问题,您可能需要在单元测试、代码审查和开发过程的其余部分中寻找问题。
      • 哦,是的,下次你接到清理整个 Linux 发行版的任务并报告你的发现时,去告诉开发人员。
      猜你喜欢
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      相关资源
      最近更新 更多