我想使用boost::filesystem提供的recursive_directory_iterator删除目录。但是在构建时,调试器会停止并显示消息接收到信号:Sigtrap 。我可以选择继续(必须执行几次,因为捕获了多个Sigtrap),程序将按预期运行,但是使用custum断点进行调试不再起作用。 “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存在或如何被激活
更重要的是:
有没有办法摆脱他们
(当然,它们仅在 Debug模式下发生,并且程序在 Release模式下运行良好,但我必须能够以某种方式继续进行调试)
谢谢你的帮助!
编辑:
我正在使用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]
最佳答案
经过大量搜索和询问,我解决了问题。
这个问题(或更确切地说是答案)给了我一个提示:
Does getting random SIGTRAP signals (in MinGW-gdb) is a sign of memory corruption?
这似乎是尝试访问损坏的内存的问题,这是由于使用未初始化的动态库而引起的。
通过使用boost::filesystem和boost::system库的静态(调试)版本,并为链接器激活-static开关,可以消除此问题。
关于c++ - Boost Filesystem:recursive_directory_iterator构造函数导致SIGTRAPS和调试问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3469463/