其他分享
首页 > 其他分享> > c – 如何调试分段错误?

c – 如何调试分段错误?

作者:互联网

它在循环中将每个元素设置为0或entry_count-1时有效.
当我设置它以使entry_count很小时,它可以工作,我用手写而不是循环(sorted_order [0] = 0; sorted_order [1] = 1; …等).

请不要告诉我如何修复我的代码.由于非常具体的原因,我不会使用智能指针或向量.而是专注于这个问题:
什么样的条件会导致这个段错误?
谢谢.

—-老 – —–

我正在尝试调试不能在unix机器上运行的代码.代码的要点是:

int *sorted_array = (int*)memory;
// I know that this block is large enough
// It is allocated by malloc earlier

for (int i = 0; i < entry_count; ++i){
  sorted_array[i] = i;
}

循环中似乎存在某个段错误.不幸的是,切换到调试模式会使segfault停止.使用cout调试我发现它必须在循环中.

接下来我想知道段错误发生在循环中有多远,所以我补充说:

std::cout << i << '\n';

它显示了整个范围,它被认为是循环并且没有段错误.

通过更多的实验,我最终在循环之前创建了一个字符串流,并为循环的每次迭代写入一个空字符串,并且没有segfault.

我尝试了一些其他各种各样的操作,试图弄清楚发生了什么.我尝试设置变量j = i;和那样的东西,但我没有发现任何有效的东西.

运行valgrind我在segfault上获得的唯一信息是它是一个“一般保护错误”和一些关于11的默认响应.它还提到有条件跳转或移动取决于未初始化的值,但是看着代码我无法弄清楚这是怎么可能的.

这可能是什么?我没有想要探索的想法.

解决方法:

这显然是程序中无效内存使用的一个症状.通过查看你的代码片段很难找到,因为它很可能是已经发生的其他坏事的副作用.

但是正如您在问题中提到的那样,您可以使用Valgrind附加程序.因为它是可重复的.所以你可能想附上你的程序(a.out).

$valgrind –tool=memcheck –db-attach=yes ./a.out

这样,当检测到第一个内存错误时,Valgrind会将您的程序附加到调试器中,以便您可以进行实时调试(GDB).这应该是理解和解决问题的最佳方式.

一旦你能够弄清楚你的第一个错误,修复它并重新运行它,看看你得到的其他错误.这个步骤应该完成,直到Valgrind没有报告错误.

但是,您应该避免在现代C程序中使用原始指针,并开始使用std :: vector std :: unique_ptr,如其他人所建议的那样.

标签:c,segmentation-fault,iostream
来源: https://codeday.me/bug/20191006/1858929.html