0
(gdb) list 1,20
1   int swap_n_add(int *xp, int *yp)
2   {
3       int x = *xp;
4       int y = *yp;
5   
6       *xp = y;
7       *yp = x;
8       return x + y;
9   }
10  
11  int main() {
12      int a1 = 534;
13      int a2 = 1057;
14      int sum = swap_n_add(&a1, &a2);
15      int diff = a1 - a2;
16  
17      return sum * diff;
18  }
(gdb) b 18
No line 18 in file "swap_n_add.c".

我想检查 main 返回的值,所以我在 18 处设置了一个断点来检查那里的寄存器 ( info register)。但它说这条线不存在,尽管它......说它确实存在。我有相同代码的朋友可以把它放在那里。

4

2 回答 2

2

我会质疑您未显示的先前设置步骤。如果您的朋友能够在那里设置断点而您没有,则可能是您做错了什么。(假设每个人都使用相同版本的所有工具)

使用适用于 Ubuntu 和 gcc 4.6.3 的 gdb 版本 7.4-2012.04 我可以看到并在相关行设置断点:

> gcc -Wall -g file.c      <-- compile with -g for debug symbols
> gdb a.out                <-- run against the executable
This GDB was configured as "x86_64-linux-gnu".     <-- make sure it was configured for 
For bug reporting instructions, please see:            your architecture
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/mike/C/a.out...done.   <-- and that your file loads symbols
(gdb) line 22, 39
22   int swap_n_add(int *xp, int *yp)   <-- mine are different because I have a bunch
23   {                                      of #include's in my test file
24      int x = *xp;
25      int y = *yp;
26  
27      *xp = y;
28      *yp = x;
29      return x + y;
30  }
31  
32  int main() {
33      int a1 = 534;
34      int a2 = 1057;
35      int sum = swap_n_add(&a1, &a2);
36      int diff = a1 - a2;
37  
38      return sum * diff;
39  }
(gdb) b 39
Breakpoint 1 at 0x400530: file file.c, line 39.

请注意,如果我在文件之外选择一行,比如.. 75,它会给你一条关于“文件中没有第 x 行”的消息:

(gdb) b 75
No line 75 in the current file.
Make breakpoint pending on future shared library load? (y or [n]) 

如果您看到这一点,值得仔细检查您的行号,您可能算错了。

如果您想查看 return ( sum * diff) 的值,您始终可以在返回之前将其设置为局部变量并在返回时中断。

于 2013-04-01T19:12:07.363 回答
1

这可能是特定于编译器/调试器的。可能没有为右大括号生成调试信息。

此外,如果您启用了优化,则可能很难或不可能在某些位置放置断点。如果您使用它,请尝试将-O参数删除到 gcc。

如果仍然没有帮助,请将返回值分配给新变量并返回该变量。

或者,您可以切换到反汇编,在ret指令上放置一个断点main()(在 x86 上执行函数返回的指令)并检查 CPU 寄存器中的返回值(应该在eaxx86 上)。

于 2013-04-01T18:24:38.450 回答