gpt4 book ai didi

c++ - gdb 显示奇怪的堆栈跟踪

转载 作者:行者123 更新时间:2023-11-30 04:08:27 25 4
gpt4 key购买 nike

我有一个 C++ 守护进程,它在工作几天后出现段错误。我用调试选项编译了它(我确信我做得很好,因为我用预谋的崩溃测试了它并且 gdb 显示了正确的堆栈跟踪),但是在生产的“真实”崩溃中我只看到以下跟踪:

(gdb) where
#0 0x00007ffff674d5a7 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1 0xffffffffffffffff in ?? ()
#2 0x0000000000000000 in ?? ()

这是什么意思?

以下源代码有潜在问题,因为它是自守护进程变得不稳定以来唯一的新代码:

namespace Foo {
Bar* Bar::instance = NULL;

Bar* Bar::getInstance() {
if (!instance)
instance = new Bar();

return instance;
}

Bar::Bar() {
curl = curl_easy_init();

if(CURLE_OK != curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &data_write)
|| CURLE_OK != curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L)
|| CURLE_OK != curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L)
|| CURLE_OK != curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, Bar::timeout)) {
throw std::runtime_error(std::string("Can't initialize curl."));
}
}

Bar::~Bar() {
curl_easy_cleanup(curl);
}

std::string Bar::getByIp(const std::string &id) {
Bar *self = getInstance();
std::string url = "example.com";
url.append(id);

std::ostringstream oss;

if (CURLE_OK == self->curl_read(url, oss)) {
std::string output(oss.str());

if (output.empty())
return NULL_OBJECT;

TiXmlDocument xml;
xml.Parse(output.c_str());

if (
xml.Error()
|| !xml.FirstChild("a")
|| !xml.FirstChild("a")->FirstChild("b")
|| !xml.FirstChild("a")->FirstChild("b")->FirstChildElement("lat")
|| !xml.FirstChild("a")->FirstChild("b")->FirstChildElement("lng")
)
return NULL_OBJECT;

std::string lat = xml.FirstChild("a")->FirstChild("b")->FirstChildElement("lat")->GetText();
std::string lng = xml.FirstChild("a")->FirstChild("b")->FirstChildElement("lng")->GetText();

return Region::getByCoordinates(lng, lat);
}

return NULL_OBJECT;
}

size_t Bar::data_write(void* buf, size_t size, size_t nmemb, void* userp)
{
if(userp)
{
std::ostream& os = *static_cast<std::ostream*>(userp);
std::streamsize len = size * nmemb;
if(os.write(static_cast<char*>(buf), len))
return len;
}

return 0;
}

CURLcode Bar::curl_read(const std::string& url, std::ostringstream& os)
{
CURLcode code(CURLE_FAILED_INIT);

if(curl)
{
if(
CURLE_OK == (code = curl_easy_setopt(curl, CURLOPT_FILE, &os))
&& CURLE_OK == (code = curl_easy_setopt(curl, CURLOPT_URL, url.c_str()))
) {
code = curl_easy_perform(curl);
}
}

return code;
}
}

最佳答案

看起来像是影响堆栈的内存损坏:在分配的内存之外写入。

您可以编写一个小程序来使用您的 Bar 类,就像您的守护程序一样,可能是在一个循环中。您还可以使用 MALLOC_CHECK_ 运行此程序。 , electric fence 、Valgrind 或任何其他内存检查工具。

它可能是 curl、TiXmlDocument 或调用您的类的代码。

关于c++ - gdb 显示奇怪的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21823052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com