【问题标题】:Unexpected behavior in GDB outputGDB 输出中的意外行为
【发布时间】:2020-09-11 11:29:19
【问题描述】:

所以我开始学习如何使用 GDB,但我的输出中出现了一些意想不到的行为。

我正在以下程序上运行 GDB

#include <stdio.h>
#include <stdlib.h>

int main() {

    unsigned int value1, abs_value1, abs_value2, abs_value3;
    int value2, value3;
    char myarray[10]; 

    printf("Enter 10 characters:");
    fgets(myarray, 11, stdin); 

    printf("Enter an integer between 0 and 10,000:");
    scanf("%d", &value1);
    abs_value1 = abs(value1);

    printf("Enter an integer between -10,000 and 0:");
    scanf("%d", &value2);
    abs_value2 = abs(value2);

    printf("Enter an integer between -10,000 and 10,000:");
    scanf("%d", &value3);
    abs_value3 = abs(value3);

    // set breakpoint here
}

我输入的值是...

value1 = 578
value2 = -1123
value3 = 999

在前两个测试一些命令时,我发现了一些有趣的行为

x/1d &abs_value3 : -25
x/1d &abs_value1 : 66

在最后两轮中,我开始得到一些预期的输出

x/1d &abs_value3 : 999
x/1d &abs_value1 : 578

我在所有测试中都使用了相同的程序并以相同的方式运行测试,但我不太担心输出中的不一致。我希望这是有道理的,我只是想知道可能是什么原因

为了澄清,我发布了一个屏幕截图。突出显示的部分显示了正在使用的相同命令,但稍后有不同的输出

【问题讨论】:

  • 请将具体问题编辑成问题。什么是意外问题?

标签: gdb


【解决方案1】:

我不太担心输出的不一致。

您没有讲述整个故事,这使得猜测发生了什么变得更加困难。

以下命令:x/1d addr 告诉 GDB 检查位于addr 的一个单元(内存),并将其打印为十进制数。

但是那个单位有多大呢?

没有明确的说明,它依赖之前执行的命令。来自gdb documentation

每次使用 x 指定单位大小时,该大小将成为您下次使用 x 时的默认单位。

因此,鉴于您的“不一致”输出:

x/1d &amp;abs_value3 : -25
x/1d &amp;abs_value3 : 999

并且还知道999 == 0x3e7(signed char)0xe7 == -25,我们可以推断您在使用x/1d 之前使用了x/1b,它产生了第一个输出,但在产生第一个输出的x/1d 之前没有使用x/1b第二个输出。

为避免混淆,始终指定您要检查的尺寸。

如果您使用了x/dw(或x/1dw,但默认为1),则每次都会打印相同的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多