gpt4 book ai didi

C++如何识别SIGNAL 11错误位置

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:26 25 4
gpt4 key购买 nike

我在 Linux 系统中运行多线程 C++ 程序(内核 2.6.23)。我的代码是使用 G++ 4.7.4 版编译的。

我添加了以下代码来捕获段错误:

void segFaultHandler(int sig)
{
void *array[10];
size_t size;

size = backtrace(array, 10);
fprintf(stderr, "Error: signal %d:\n", sig);
backtrace_symbols_fd(array, size, STDERR_FILENO);
exit(1);
}

在主要部分:

main()
{
signal(SIGSEGV, segFaultHandler);

try {

program code here...

catch(const std::exception& ex)
{
std::cerr << "Error occurred: " << ex.what() << std::endl;
}
catch(...)
{
std::cerr << "Unknown failure occurred. Possible memory corruption" << std::endl;
}

return 0;
}

运行时,我的程序崩溃,输出如下:

Error: signal 11:
/home/cross/bin/aeirtu[0x807406e]
[0xffffe420]
/lib/libc.so.6(memcpy+0x2f)[0xb7d9bcbf]
/usr/gcc-4.7.4/lib/libstdc++.so.6(_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci+0x73)[0xb7f26933]

这不是一个简单的调试,因为我的程序只是有时崩溃,所以我需要一个工具来获取崩溃源并修复它。

根据给定的输出,我如何追溯导致崩溃的函数和代码段?

最佳答案

您可以使用 valgrind定位段错误的来源。如果您的二进制文件是使用调试符号编译的,它将为您提供确切的源位置:

==12834== Invalid write of size 4
==12834== at 0x4004FD: main (test.cc:3)
==12834== Address 0x0 is not stack'd, malloc'd or (recently) free'd

关于C++如何识别SIGNAL 11错误位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34139308/

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