我们开发了一个动态库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;
}
我想知道为什么会这样,我可以在调试时避免崩溃吗?
答案 0 :(得分:1)
这里常见的事情是运行&#34; gdb gdb&#34;然后使用堆栈跟踪提交错误报告。
另一种可能性是您可以尝试更新到更新版本的gdb。这可能有所帮助。
无论如何,这只是一个错误。非常新版本的gdb对这种崩溃有一些保护作用;但是防止所有崩溃很难。