【问题标题】:Core Dumps but gdb is not able its find the exact location核心转储但 gdb 无法找到确切位置
【发布时间】:2017-10-13 09:19:15
【问题描述】:

假设我有一个数组 A[10] 和一些其他变量

我将它初始化为

for(int i=0;i<20;i++) //intentionally 20
    A[i]=0;

因此,当您运行此 LIBRARY 时,它将初始化数组而不会出现任何错误并且也可以访问,但 gdb 在其他地方提供核心转储(在我的情况下,它显示内存其他变量已更改)
为什么在数组初始化期间不提供核心转储?

【问题讨论】:

  • 因为当你越界时,它会导致undefined behavior 有时似乎工作正常(直到它不起作用的那一刻)。如果你有 UB,那么猜测程序其余部分的行为是没有意义的。
  • 至于如何发现此类问题,请考虑使用内存调试器(例如Valgrind),或者可能经常擅长发现此类问题的静态分析工具。我认为 GCC 也有一些选项可以在运行时添加边界检查。
  • 在 gcc 和 clang 中,您可以使用地址清理程序进行边界检查:我认为您只需要添加 '-fsanitize=address' 来编译选项和 '-lasan' 到链接选项

标签: c++ gdb core


【解决方案1】:

在 c/c++ 中,您没有保护超出数组范围的保护,一旦您访问不属于该进程的内存,就会发生崩溃。 所以只要你越界,只像其他变量一样在堆栈或堆中写入你自己的内存......程序不会崩溃,但其他变量会被改变,如果你通过这个改变一个指针可能会导致未来崩溃,因为指针将指向某个随机内存地址

【讨论】:

  • 而且有时,当您编写嵌入式或内核代码时,没有“不属于进程的内存”之类的东西,因此您永远无法访问违规。
【解决方案2】:

只有在运行时,才会在编译时对原始数组等 POD 进行越界错误检查。您正在调用undefined behaviour。话虽这么说,更喜欢 std::vectorstd::array 而不是 C++ 中的原始(C 风格)数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多