gpt4 book ai didi

c++ - 如何调试段错误?

转载 作者:行者123 更新时间:2023-11-30 01:14:58 24 4
gpt4 key购买 nike

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

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

----旧的-----

我正在尝试调试不能在 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;
}

循环中的某处似乎存在段错误。不幸的是,切换到 Debug模式会使段错误停止。使用cout调试发现一定是在循环中。

接下来我想知道段错误发生在循环中多远,所以我添加了:

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

它显示了它应该循环的整个范围并且没有段错误。

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

我尝试了一些其他的各种操作,试图弄清楚发生了什么。我尝试设置一个变量 j = i;之类的东西,但我还没有找到任何有用的东西。

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

这会是什么?我没有探索的想法。

最佳答案

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

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

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

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

一旦你能够找出你的第一个错误,修复它并重新运行它,看看你得到的其他错误是什么。应该完成这些步骤,直到 Valgrind 没有报告任何错误。

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

关于c++ - 如何调试段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29324796/

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