我们开发了一个动态库L.so和一个使用它的可执行文件X。都是用调试信息编译的。运行gdb X时:
从X...Segmentation故障读取符号(核转储)
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;
}我想知道为什么是这样的,我在调试时能避免崩溃吗?
发布于 2014-09-07 13:32:56
这里通常要做的事情是运行"gdb gdb“,然后用堆栈跟踪来提交一个bug报告。
另一种可能是,您可以尝试更新到较新版本的gdb。也许能帮上忙。
不管怎么说,这只是个小虫子。非常新版本的gdb有一些针对此类崩溃的保护;但是,对所有崩溃进行保护是很困难的。
https://stackoverflow.com/questions/25708671
复制相似问题