我的测试用例非常简单,我必须做一些非常愚蠢的事情。我写了一个简单的源文件test.c
:
#include<stdio.h>
int main(int argc,char* argv[]){
printf("1\n");
printf("2\n");
printf("3\n");
return 0;
}
我使用gcc -g test.c
编译了它并使用gdb a.out
启动了GDB。然后我在main
中使用break main
创建了一个断点并使用run
运行(也尝试使用start
) - 但是GDB只是忽略了我的断点!
这是我尝试编译test.c
并运行GDB的shell会话:
[idanarye@idanarye_lg gdbtest]$ gcc -g test.c
[idanarye@idanarye_lg gdbtest]$ gdb a.out
GNU gdb (GDB) 7.6.1
Copyright (C) 2013 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 "x86_64-unknown-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/idanarye/gdbtest/a.out...done.
(gdb) break main
Breakpoint 1 at 0x40050f: file test.c, line 4.
(gdb) run
Starting program: /home/idanarye/gdbtest/a.out
1
2
3
During startup program exited normally.
(gdb)
世界上我在这里做错了什么?
我正在运行64位Arch Linux。我的GCC版本是4.8.2。
更新
以下是disas main
的结果:
Dump of assembler code for function main:
0x0000000000400500 <+0>: push %rbp
0x0000000000400501 <+1>: mov %rsp,%rbp
0x0000000000400504 <+4>: sub $0x10,%rsp
0x0000000000400508 <+8>: mov %edi,-0x4(%rbp)
0x000000000040050b <+11>: mov %rsi,-0x10(%rbp)
0x000000000040050f <+15>: mov $0x4005c4,%edi
0x0000000000400514 <+20>: callq 0x4003e0 <puts@plt>
0x0000000000400519 <+25>: mov $0x4005c6,%edi
0x000000000040051e <+30>: callq 0x4003e0 <puts@plt>
0x0000000000400523 <+35>: mov $0x4005c8,%edi
0x0000000000400528 <+40>: callq 0x4003e0 <puts@plt>
0x000000000040052d <+45>: mov $0x0,%eax
0x0000000000400532 <+50>: leaveq
0x0000000000400533 <+51>: retq
End of assembler dump.
不知道如何或为何,但它现在有效。可能系统更新修复了它......
答案 0 :(得分:3)
(由评论策划)
你似乎没有做错事;这似乎是GDB的错。
消息During startup program exited normally.
是异常的,正确的是Program exited normally.
。它表明GDB无法在main()
中插入断点,或者跟踪程序对ptrace(PT_TRACE_ME, 0, 0, 0)
的调用失败。程序因此在没有被停止的情况下运行,并且在GDB仅期望它启动并停在exec()
时退出。您可以在gdb
下执行strace
grep
以及strace
ptrace
的日志查看任何失败的strace -f -o syscall.txt gdb ./a.out
来电吗?
您可以使用{{1}}。
截至目前,一个权宜之计似乎是以GDB的身份运行GDB。
答案 1 :(得分:0)
我遇到了类似的问题,就我而言,情况是我的程序在分叉。因此,基本上,我的代码如下所示:
"$(deployment)-.*"
我正在创建一个断点,其中调用了“ func”函数。但是,我在不知不觉中没有传递正确的参数,因此我的程序为自己分配了正确的参数。因此,现在基本上从子进程中调用了“ func”,事实证明,gdb没有在子进程中设置断点,这就是为什么未命中断点的原因。
答案 2 :(得分:0)
我有同样的问题。那是断断续续的,使我发疯。 然后我发现自己做了一件愚蠢的事。我一直从命令行运行程序,它有很多参数。
因此,我使用鼠标复制粘贴缓冲区复制了命令行。
然后开始:gdb程序
然后做了:打破男人
然后做了:-PASTE-FROM-MOUSE-
它从未停止过,直到我意识到我在命令行中粘贴了 很多: “ --option = c ... |&tee日志”
这似乎是一个间歇性问题,直到我意识到这是一个脑部错误。 希望这对某人有帮助。命令行重定向-在GDB中做了什么,不知道是什么(除了忽略断点)。