Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调试器赢了';t在MacOS C+上的LLDB内部注册陷阱信号+;Visual Studio代码_C++_Macos_Debugging_Visual Studio Code_Lldb - Fatal编程技术网

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;