【发布时间】:2021-11-14 07:07:09
【问题描述】:
每当 GDB 进入函数时,它不会在帧信息中显示正确的参数,而是打印垃圾数据
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
$ gcc t.c -g #不使用其他标志
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
程序(t.c):
#include<stdio.h>
void foo(int v){
printf(" BAR = %d\n", v);
}
int main(){
int a = 8;
foo(a);
a = 33;
foo(a);
foo(85);
}
GDB 输出:
Breakpoint 1, main () at t.c:7
7 int main(){
(gdb) step
8 int a = 8;
(gdb) step
9 foo(a);
(gdb) step
foo (v=21845) at t.c:3
3 void foo(int v){
(gdb) finish
Run till exit from #0 foo (v=21845) at t.c:3
BAR = 8
main () at t.c:10
10 a = 33;
(gdb) s
11 foo(a);
(gdb)
foo (v=8) at t.c:3
3 void foo(int v){
(gdb) fin
Run till exit from #0 foo (v=8) at t.c:3
BAR = 33
main () at t.c:12
12 foo(85);
(gdb) s
foo (v=33) at t.c:3
3 void foo(int v){
(gdb) fin
Run till exit from #0 foo (v=33) at t.c:3
BAR = 85
0x00005555555551a9 in main () at t.c:12
12 foo(85);
(gdb) s
13 }
但是在单步执行函数后,参数会写入正确的数据:
Breakpoint 1, main () at t.c:7
7 int main(){
(gdb) s
8 int a = 8;
(gdb)
9 foo(a);
(gdb)
foo (v=21845) at t.c:3
3 void foo(int v){
(gdb) info args
v = 21845
(gdb) s
4 printf(" BAR = %d\n", v);
(gdb) info args
v = 8
有没有办法解决这个问题,让 GDB 显示正确的函数参数?
【问题讨论】:
-
你说的垃圾数据是什么?
21845中的(v=21845)? -
@Jabberwocky 是的,还有所有后续函数调用,因为它们显示以前的参数而不是当前参数
-
使用 gcc 8.3.0 + gdb 8.2.1 为我正确工作。查看 godbolt.org,您的示例代码的程序集在 gcc 8.3 和 9.3 之间没有变化。那么可能是 gdb 9.2 中的错误?
-
虽然我也用 gcc 10.2.0 + gdb Debian 9.2-1 得到了正确的结果 (
foo (v=8) at test.c:4)。为我工作