C ++,调试符号和GDB

时间:2014-09-07 09:10:02

标签: c++ gdb segmentation-fault

我们开发了一个动态库L.so和一个使用它的可执行文件X.两者都编译有调试信息。在运行gdb X时:

从X中读取符号...分段错误(核心转储)

X包含4个对象,我发现哪个对象导致崩溃。可以说,如果编译了S.cpp,它会在gdb中崩溃。 S.cpp:

class Service { private: ... private: ... LongTaskService longTaskService_; // Implementation is in L.so

如果我从S.cpp中删除此方法,崩溃将消失:

bool Service::downloadFile(const string &mapName, int &taskId) {
   Properties dProps;
   if(!config_.get("downloadService", dProps)) {
     LOGG(Logger::ERROR) << "Failed to get config props for downloadService" << Logger::FLUSH;
     return false;
   }
   string url = dProps.get("downloadUrl");
   if(url == "") {
       LOGG(Logger::ERROR) << "Failed to get url for downloadService" << Logger::FLUSH;
       return false;
   }
   if(url[url.size()-1] != "/")
       url += "/";

   LOGG(Logger::DEBUG) << "Initializing download from "<< url << mapName << Logger::FLUSH;
   URL dUrl(url+mapName);
   vector<string> outPath = {workDir_, mapName};
   URL outFile(FsUtil::makePath(outPath));
   taskId = longTaskService_.submit(DownloadTask::run, dUrl, outFile); // This line causes problems 
   return true;
}

我想知道为什么会这样,我可以在调试时避免崩溃吗?

1 个答案:

答案 0 :(得分:1)

这里常见的事情是运行&#34; gdb gdb&#34;然后使用堆栈跟踪提交错误报告。

另一种可能性是您可以尝试更新到更新版本的gdb。这可能有所帮助。

无论如何,这只是一个错误。非常新版本的gdb对这种崩溃有一些保护作用;但是防止所有崩溃很难。