GDB为数组值

时间:2015-11-25 18:09:23

标签: c linux debugging ubuntu gdb

我正在尝试完成Problem 4 of Project Euler,而且我一直在努力调试我的解决方案已有一段时间了。错误本身不是我的问题的一部分 - 我无法弄清楚为什么GDB不会向我显示找出错误所需的数组值。

每当gdb到达此循环时,

for (int i = numDigits; i > 0; i--) {
    numArray[i-1] = prevPalindrome % 10;
    prevPalindrome /= 10;

我无法通过命令print numArrayprint numArray[0]print numArray[5]从GDB获取值。

GDB改为执行以下操作:

  • print numArray返回$1 = <optimized out>
  • print numArray[0]print numArray[5]返回`值已经过优化'

我已经搜索过StackOverflow以解决这个问题。我尝试了以下方法,但没有一个有效:

  • 我的makefile已使用-O0(其命令为clang -ggdb3 -O0 -std=c99 -Wall -Werror test.c -lcs50 -lm -o test),因此我尝试仅使用clang -O0 test.c -lcs50 -lm -o test。这没有做任何事情。
  • 我尝试使用-0g,但我遇到了编译错误。
  • 我尝试使numArray易变。我得到了要编译的代码,但它仍然是<optimized out>
  • 我尝试了TUI模式at the suggestion of @Zan-Lynx,这很酷,但说实话,我迷路了它仍然是<optimized out>

我在这里缺少什么吗?我不应该只能打印数组值吗?

完整代码可用here,第95行有问题循环。

2 个答案:

答案 0 :(得分:1)

我可以想到两个可能的原因:

  1. 您正在调试错误的二进制文件(即您认为您正在调试-O0二进制文件,但实际上正在调试-O2-O3二进制文件。
  2. 与GCC相比,您的GDB太旧了,并且不了解更新的调试格式。
  3. 为了消除#1的可能性,在访问numArray之前添加abort(),重建程序,在GDB下运行它,并确认它以SIGABRT消亡。如果没有,我的猜测是正确的,你正在调试一个与你认为正在调试的二进制文件不同的二进制文件。

答案 1 :(得分:0)

只是-g会有效吗?另外,请忽略O0。与clang -g -std=c99 -Wall -Werror test.c -lcs50 -lm -o test中一样。