C++ 调试器赢了';t在MacOS C+上的LLDB内部注册陷阱信号+;Visual Studio代码
当我在调试器之外运行可执行文件时,我会得到以下断言,它会触发一个陷阱:C++ 调试器赢了';t在MacOS C+上的LLDB内部注册陷阱信号+;Visual Studio代码,c++,macos,debugging,visual-studio-code,lldb,C++,Macos,Debugging,Visual Studio Code,Lldb,当我在调试器之外运行可执行文件时,我会得到以下断言,它会触发一个陷阱: Apr 29 08:25:21 ./xmlpgtest_doccopy[39308] <Error>: <Error>: Assert:[/Users/davidbien/dv/xmlp/xmlpinc/xml_tag.h:49],void ns_xmlp::xml_tag<ns_xmlp::xml_traits<ns_lxo::_l_transport_file<char8_t&
Apr 29 08:25:21 ./xmlpgtest_doccopy[39308] <Error>: <Error>: Assert:[/Users/davidbien/dv/xmlp/xmlpinc/xml_tag.h:49],void ns_xmlp::xml_tag<ns_xmlp::xml_traits<ns_lxo::_l_transport_file<char8_t>, false, false>>::AssertValid(const ns_xmlp::xml_tag::_TyThis *) const [t_TyXmlTraits = ns_xmlp::xml_traits<ns_lxo::_l_transport_file<char8_t>, false, false>](): _ptagParent == m_ptagParent.
[1] 39308 trace trap ./xmlpgtest_doccopy ~/dv/xmlp/unittests/unittest1.xml
因此,我很难调试这个。例如,在Linux下使用GDB在Visual Studio代码下进行调试时不会发生这种情况,当然我可以在Windows的MSVC下进行调试
任何帮助都将不胜感激。请不要嘲笑,我是C++开发者,在过去的28年里,我知道我在做什么。
我在这里查看了各种可能的解决方案,包括有人建议从命令窗口向低级LLDB进程(正在调试的进程)发送陷阱信号,但这没有任何效果
以下是我如何在各种操作系统/编译器组合中突破调试器:
#ifdef _MSC_VER
#define DEBUG_BREAK __debugbreak()
#elif defined( __clang__ )
#if __has_builtin(__builtin_debugtrap)
#define DEBUG_BREAK __builtin_debugtrap()
#else
#define DEBUG_BREAK __builtin_trap()
#endif
#elif defined( __GNUC__ )
#define DEBUG_BREAK __builtin_trap()
#else
#error Need to know the OS/compiler for breaking into the debugger.
#endif
我正在使用最新Xcode版本中的clang12和同一版本中的最新lldb进行编译
编辑:我确实在AV(访问冲突)上中断,所以也许我应该只是AV而不是发出陷阱信号
编辑:我按照本的建议做了(谢谢本),结果是行为没有改变
-exec process handle -p TRUE -s TRUE SIGTRAP
NAME PASS STOP NOTIFY
=========== ===== ===== ======
SIGTRAP true true true
发送SIGTRAP时,它仍然挂起
编辑:我插入:
*((volatile char*)0) = 0xba;
DEBUG_BREAK;
希望我能在调试器中插入AV。调试器仍然挂起
编辑:VisualStudioCode扩展代码CodeLLDB可以工作并访问我的断言,还有一些其他非常棒的东西,比如告诉您变量的活动类型。该漏洞显然存在于微软发布的lldb mi中。我可能会给他们一个错误
小结:这是由于lldb mi中的错误造成的。在运行
handle SIGTRAP noprint nostop
后,您可能会从gdb获得相同的行为。调试器中的信号处理是可配置的…@BenVoigt这是一个可操作的注释吗?可能有帮助(它讨论了在不同信号的上下文中配置lldb信号处理,您应该能够将其适应SIGTRAP):@BenVoigt谢谢-这至少是一个很好的兔子洞。确保它是可操作的,您可以在gdb中运行该命令并了解“hey lldb的行为与nostop配置中的gdb完全相同”或“实际上它的行为仍然不同,因此不太可能是调试器信号配置”。此外,了解gdb命令可以在搜索lldb命令时使用关键字。
*((volatile char*)0) = 0xba;
DEBUG_BREAK;