Boost Filesystem:recursive_directory_iterator构造函数导致SIGTRAPS和调试问题

时间:2010-08-12 15:43:36

标签: c++ debugging boost

我想使用boost :: filesystem提供的recursive_directory_iterator来删除目录。但在构建时,调试器将停止并显示消息信号接收:Sigtrap 。我可以选择继续(必须多次执行,因为捕获了多个Sigtraps)并且程序将按预期工作,但使用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实现细节的深处。

有没有人知道为什么这些Sigtrap存在或者它们是如何被激活的 甚至更重要的是: 有没有办法摆脱它们

(当然它们只出现在调试模式下,程序在发布模式下工作正常,但我必须能够以某种方式继续调试)

感谢您的帮助!


编辑: 我正在使用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&gt; :: _ Rep :: _ S_empty_rep_storage()
08:地址:[@ 0x003e0000]
09:std :: basic_string,std :: allocator&gt; :: _ Rep :: _ S_empty_rep_storage()
10:地址:[@ 0x40000060]
11:地址:[@ 0x0022f968]
12:地址:[@ 0x00000000]

1 个答案:

答案 0 :(得分:3)

经过大量的搜索和询问,我解决了这个问题。 这个问题(或者更确切地说是答案)给了我一个提示:
Does getting random SIGTRAP signals (in MinGW-gdb) is a sign of memory corruption?

这似乎是尝试访问损坏的内存,这是由使用未初始化的动态库引起的。

通过使用boost :: filesystem和boost :: system库的静态(调试)版本,并激活链接器的-static开关,可以解决问题。