【问题标题】:How to stop LLDB when error occurs发生错误时如何停止 LLDB
【发布时间】:2017-02-06 10:31:44
【问题描述】:

我想改进对 PyInstaller 问题https://github.com/pyinstaller/pyinstaller/issues/2355 的已经很好的分析。为此,我需要捕获所有错误或使用 LLDB 设置特定断点。

在 GitHub 上I stated

对于初学者来说,基本上只需要一个断点来捕获所有错误,然后转储调用堆栈。 我试过break set -E C++breakpoint set --selector __cxa_throw: [...] 但不,不会停止。

执行确实停止,即到达断点if I do b Get,但这个选择器影响的功能太多了。

总之,我怎样才能使http://frightanic.com/misc/hello-world 上的可执行文件在./src/common/stdpbase.cpp(62) 发生错误时立即停止?

【问题讨论】:

    标签: c++ macos pyinstaller lldb


    【解决方案1】:

    --selector 在 ObjC 选择器名称上指定一个中断。所以我不希望那个工作。我不知道这些检查宏是如何工作的,但是被绊倒的那个说它在非调试中返回一个值或在调试器中停止以进行调试,所以如果它抛出 C++ 异常,我会感到惊讶。 C++ 异常断点没有被触发的事实证明了这一点。您可以为 lldb 的断点指定一个 class::method。所以你可以试试:

    (lldb) break set -n wxStandardPathsBase::Get
    

    这应该会缩小断点的范围。当然,如果你有 wxwidgets 的调试信息,你应该能够设置一个文件和行断点,这也会更精确。

    【讨论】:

    • 感谢您的洞察力。您建议的断点显然不正确,但执行并未停止。我真的很困惑......它只是应该工作。我不知道 PyInstaller 究竟是如何到达它产生的二进制文件的。你能从我在问题中链接的二进制文件中得到什么吗?
    • 该二进制文件看起来已被剥离。它没有链接到任何看起来像 wxWhatever 的东西,所以我认为这些东西已经被静态链接到 hello world 二进制文件中,但是符号表已经被剥离了。如果您想亲自查看,工具“nm”将向您显示符号。在构建的某个时刻,有一个未剥离的二进制文件,其中仍有调试器可以中断的符号。你想调试那个阶段而不是 post-strip 二进制文件。
    • 我在分析的早期就考虑过这一点(虽然不知道nm),但根据pyinstaller.readthedocs.io/en/stable/usage.html,只有将--strip 传递给PyInstaller 或有@,符号表才会被剥离.spec 文件中的 987654326@。我不怀疑你的分析,但我很困惑。将继续搜索...
    • 此外,如果另一方面缺少符号表,我怎么能知道在./src/common/stdpbase.cpp(62) 处执行失败?两者有什么关系?
    • 有问题的代码在打印错误时可能使用了__FILE__ 等宏。这些将文件/函数/行号烘焙到实际代码中,就像任何其他静态字符串数据一样。
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2023-04-04
    • 2021-02-14
    • 2012-11-07
    • 1970-01-01
    • 2020-10-25
    • 2020-06-17
    • 2018-09-18
    相关资源
    最近更新 更多