C++ 发生错误时如何停止LLDB

C++ 发生错误时如何停止LLDB,c++,macos,pyinstaller,lldb,C++,Macos,Pyinstaller,Lldb,我想改进对PyInstaller问题已经很好的分析。为此,我需要捕获所有错误或使用LLDB设置特定断点 关于GitHub 对于初学者来说,基本上只需要一个断点来捕获所有错误,然后转储调用堆栈。 我尝试了中断集-ec++,断点集--selector\uucxa\uthrow:[…]但是没有,没有停止 执行确实会停止,即达到断点,但此选择器影响的函数太多 总之,当错误发生在/src/common/stdpbase.cpp(62)时,如何使可执行文件在处可用,并立即停止?--selector指定Obj

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

关于GitHub

对于初学者来说,基本上只需要一个断点来捕获所有错误,然后转储调用堆栈。 我尝试了
中断集-ec++
断点集--selector\uucxa\uthrow:
[…]但是没有,没有停止

执行确实会停止,即达到断点,但此选择器影响的函数太多

总之,当错误发生在
/src/common/stdpbase.cpp(62)
时,如何使可执行文件在处可用,并立即停止?

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

(lldb) break set -n wxStandardPathsBase::Get

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

感谢您的帮助。不过,您建议的断点显然不正确,执行没有停止。我真的很困惑……它应该会起作用。我不知道PyInstaller是如何精确地到达它生成的二进制文件的。你能从我在问题中链接的二进制文件中得到什么吗?那个二进制文件看起来好像已经被剥离了。它没有链接到任何看起来像wxwhater的东西,所以我假设这些东西已经静态链接到hello-world二进制文件中,但是符号表已经被剥离。如果您想亲自查看,工具“nm”将向您显示符号。在构建过程中的某个时刻,存在一个未压缩的二进制文件,其中仍然有调试器可以使用的符号。您希望调试该阶段而不是post strip二进制文件。我在分析早期就考虑过这一点(虽然不知道
nm
),但根据符号表,只有将
--strip
传递给PyInstaller或在
.spec
文件中包含
strip=True
时,才会剥离。我不怀疑你的分析,但我感到困惑。将继续搜索…此外,如果另一方面缺少符号表,如何告诉我在
/src/common/stdpbase.cpp(62)
处执行失败?这两者之间的相关性是什么?所讨论的代码在打印错误时可能会使用
\uuuu文件\uuuu
etc宏。它们将文件/函数/行号烘焙到实际代码中,就像任何其他静态字符串数据一样。