为什么 gdb 命令 "info locals" 也打印未声明的变量?
Why gdb command "info locals" also print undeclared variable?
int a = 10;
if(a >= 5)
printf("Hello World");
int b;
b = 3;
例如,我在执行第 4 行“int b;”之前命令“info locals”但是 gdb 打印变量 a 和 b 的信息。为什么 gdb 是这样工作的?我怎样才能只打印声明的变量?
gdb 显示 b 变量,因为它已被您的编译器声明
假设这段代码在函数内部,一旦执行流进入函数,它就会在堆栈中分配局部变量,这就是 a 和 b 值所在的位置。那是因为编译器会读取您的代码并在开头进行所有声明,即使它们尚未在您的函数之上声明。
看看
这取决于编译器决定编译代码的方式。
在您的情况下,我相信由于变量 b
将始终在您的代码中使用,因此编译器可能会同时“声明” a
和 b
以优化执行时间。
如果你真的想了解发生了什么,请反汇编程序并查看执行此代码时实际运行的程序集。
我假设您会发现在堆栈帧上为变量 b
分配 space 的指令为两个变量(a
和 b
分配了 space ) 同时。
int a = 10;
if(a >= 5)
printf("Hello World");
int b;
b = 3;
例如,我在执行第 4 行“int b;”之前命令“info locals”但是 gdb 打印变量 a 和 b 的信息。为什么 gdb 是这样工作的?我怎样才能只打印声明的变量?
gdb 显示 b 变量,因为它已被您的编译器声明
假设这段代码在函数内部,一旦执行流进入函数,它就会在堆栈中分配局部变量,这就是 a 和 b 值所在的位置。那是因为编译器会读取您的代码并在开头进行所有声明,即使它们尚未在您的函数之上声明。
看看
这取决于编译器决定编译代码的方式。
在您的情况下,我相信由于变量 b
将始终在您的代码中使用,因此编译器可能会同时“声明” a
和 b
以优化执行时间。
如果你真的想了解发生了什么,请反汇编程序并查看执行此代码时实际运行的程序集。
我假设您会发现在堆栈帧上为变量 b
分配 space 的指令为两个变量(a
和 b
分配了 space ) 同时。