我想使用 boost::filesystem 提供的 recursive_directory_iterator 来删除目录。但在构建时调试器会停止并显示消息收到信号:Sigtrap。我可以选择继续(必须执行多次,因为捕获了多个 Sigtrap)并且程序将按预期工作,但使用自定义断点进行调试不再起作用。 “fs::path dir”指向的路径是有效的,我也尝试使用类似的字符串fs::... dirIter( "D:/validPath" ),但问题依然存在。
#include <boost/filesystem.hpp>
namespace boost::filesystem = fs;
void recursiveDeleteDir( fs::path dir )
fs::recursive_directory_iterator endIter;
//At this point debugging is stopped with the message
//Signal Received: SIGTRAP
fs::recursive_directory_iterator dirIter( dir );
for(;dirIter != endIter ; ++dirIter)
{
// do something
}
}
当我试图找出 Sigtrap 的确切来源时,我迷失在 boost::filesystem 实现细节的深处。
有谁知道为什么这些 Sigtraps 存在或者它们是如何激活的
更重要的是:
有没有办法摆脱它们
(当然,它们只发生在调试模式下,程序在发布模式下工作正常,但我必须能够以某种方式继续调试)
感谢您的帮助!
编辑:
我正在使用 NetBeans IDE,但无法访问完整的调用堆栈。但这就是收到 sigtrap 信号时它包含的内容:
01: ntdll!RtlpNtMakeTemporaryKey()
02: ntdll!RtlpNtMakeTemporaryKey()
03: ntdll!RtlpNtMakeTemporaryKey()
04: ntdll!LdrFindEntryForAddress()
05:地址:[@0x003e0000]
06:地址:[@0x50000061]
07: std::basic_string,std::allocator>::_Rep::_S_empty_rep_storage()
08:地址:[@0x003e0000]
09: std::basic_string,std::allocator>::_Rep::_S_empty_rep_storage()
10:地址:[@0x40000060]
11:地址:[@0x0022f968]
12:地址:[@0x00000000]
经过大量搜索和询问,我解决了这个问题。
这个问题(或者更确切地说是答案)给了我一个提示:
获得随机 SIGTRAP 信号(在 MinGW-gdb 中)是否是内存损坏的标志? https://stackoverflow.com/questions/2307621/does-getting-random-sigtrap-signals-in-mingw-gdb-is-a-sign-of-memory-corruption
这似乎是尝试访问损坏的内存的问题,这是由于使用未初始化的动态库引起的。
通过使用 boost::filesystem 和 boost::system 库的静态(调试)版本,并激活链接器的 -static 开关,就可以解决这个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)