我在Ubuntu 9.10上使用GCC 4.4.1和GDB 7.0-ubuntu。但是,使用以下任何开关时,GCC不会生成调试器信息:-g,-g3,-ggdb或-ggdb3。因此,当我使用GDB运行程序时,就好像没有生成调试器信息一样。我在一个新的空文件夹中创建了非常简单的测试源文件。
这是一个例子:
#include <stdlib.h>
#include <stdio.h>
int main (int argc, char **argv)
{
char msg[4];
// allocate 4 bytes on the stack
strcpy (msg, "hello world");
// overflow
printf ("%s\n", msg);
return 0;
}
更新:这是我的命令行序列:
gcc -g。/ mytest.c -o mytest
gdb ./mytest
更新:我之前打开了MALLOC_CHECK_ = 1,以便测试代码中的堆栈溢出问题。这样可以让我得到一个堆栈跟踪。但是,无论是否包含调试信息,堆栈跟踪都没有区别。我期望看到的调试器信息是GDB下发生问题的文件的行号。然而,这不会发生。
答案 0 :(得分:1)
工作正常。我在计算机上运行调试器。我不得不添加
#include <string.h>
编译它。我调用了文件debugger.c
。以下是步骤:
gcc -g debugger.c
gdb a.out
将启动调试器
GNU gdb 6.3.50-20050815
...
...
(gdb) run
Starting program: /Developer/stackoverflow/extern/a.out
Reading symbols for shared libraries +. done
Program received signal SIGABRT, Aborted.
0x00007fff88040886 in __kill ()
(gdb) backtrace
#0 0x00007fff88040886 in __kill ()
#1 0x00007fff880e0e4f in __abort ()
#2 0x00007fff880d5693 in __chk_fail ()
#3 0x00007fff8802f851 in __strcpy_chk ()
#4 0x0000000100000f04 in main (argc=1, argv=0x7fff5fbff958) at debugger.c:9
(gdb)
编辑:对不起,没有看到这是标记为c而不是c ++。但是,不会更改运行调试器的任何内容。相应地改变了它。
Edit2:阅读您的编辑,似乎您的问题不是运行调试器,而是获取代码失败的信息。您可以使用backtrace
来实现这一目标。
答案 1 :(得分:0)
你想:
gcc -g test.c -o mytest
gdb mytest
永远不要调用任何“测试” - 它与内置的shell冲突。“test.o”按照惯例是对象文件的名称,而不是可执行文件。
答案 2 :(得分:0)
你的评论说你跑了:
gcc -ggdb ./test.c -o test.o
这可能不是你想要的。
gcc -ggdb -o mytest test.c
更有可能获得成功。如果gdb ralphs那么你的gcc或gdb安装有问题。