GDB能否调试采用GCC样式的嵌套C函数?

3

是否有可能让gdb调试器与gcc风格的嵌套函数一起工作?如果是,需要哪些版本的gcc / gdb?

2个回答

2

0

看起来gcc/gdb已经掌握了它的诀窍。在早期版本中它根本无法工作,但下面是一个简单会话的记录:

jla@jla-desktop$ gdb --version
GNU gdb (GDB) Fedora (7.2-51.fc14)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
~
jla@jla-desktop$ gcc --version
gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

~
jla@jla-desktop$ cat hello.c
#include<stdio.h>

void main(void)
{
    char* hello="hello";
    int sub(int a){
        int b;
        int c;
        b=a;
        a++;
        c=a;
        return a+b+c;
    }

    printf("%s(%i)\n", hello, sub(3));
}

~
jla@jla-desktop$ gcc -ggdb3 hello.c -o hello
~
jla@jla-desktop$ gdb hello
GNU gdb (GDB) Fedora (7.2-51.fc14)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/jla/hello...done.
(gdb) b main
Breakpoint 1 at 0x80483f1: file hello.c, line 5.
(gdb) list
1   #include<stdio.h>
2   
3   void main(void)
4   {
5       char* hello="hello";
6       int sub(int a){
7           int b;
8           int c;
9           b=a;
10          a++;
(gdb) r
Starting program: /home/jla/hello 

Breakpoint 1, main () at hello.c:5
5       char* hello="hello";
Missing separate debuginfos, use: debuginfo-install glibc-2.13-2.i686
(gdb) info locals
hello = 0x7aeff4 "|\355z"
(gdb) s
15      printf("%s(%i)\n", hello, sub(3));
(gdb) s
sub (a=3) at hello.c:9
9           b=a;
(gdb) info locals
b = 134518388
c = 0
(gdb) p a
$1 = 3
(gdb) p b
$2 = 134518388
(gdb) p c
$3 = 0
(gdb) where
#0  sub (a=3) at hello.c:9
#1  0x08048405 in main () at hello.c:15
(gdb) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接