首页 > 解决方案 > GDB 输出中的意外行为

问题描述

所以我开始学习如何使用 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

解决方案


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

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

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

但是那个单位有多大?

如果没有明确的说明,它依赖先前执行的命令。来自gdb 文档

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

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

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

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

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

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


推荐阅读