所以我尝试调试这个简单的 c 程序
#include<stdio.h>
#include<string.h>
int main(){
char str_a[20];
strcpy(str_a,"Hello, world!\n");
printf(str_a);
return 0;}
gcc-g-o prog 程序.c
gdb-q./prog 命令
(gdb) list
1 #include<stdio.h>
2 #include<string.h>
3
4 int main(){
5
6 char str_a[20];
7
8 strcpy(str_a,"Hello, world!\n");
9 printf(str_a);
10
(gdb) break 7
Breakpoint 1 at 0x757: file char_array.c, line 7.
(gdb) break strcpy
Function "strcpy" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (strcpy) pending.
(gdb) break 9
Breakpoint 3 at 0x76a: file char_array.c, line 9.
(gdb) r
Starting program: /home/pinguino/Desktop/char_array
Breakpoint 1, main () at char_array.c:8
8 strcpy(str_a,"Hello, world!\n");
(gdb) c
Continuing.
Breakpoint 3, main () at char_array.c:9
9 printf(str_a);
正如您所见,它完全跳过了 strcpy 断点... 这个问题已经发布在 stackoverflow 等网站上,但那里的所有答案都对我没用:我尝试添加 -fno-builtin,但没有任何结果。救命,我迷路了。
更多信息:uname --all Linux 4.10.0-33-generic #37-Ubuntu SMP Fri Aug 11 10:55:28 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
答案1
这可能不是 Ubuntu 特有的问题,所以请查看stackoverflow 上的这个答案。
如果该代码:
#include<stdio.h>
#include<string.h>
int main(){
char str_a[20];
strcpy(str_a,"Hello, world!\n");
printf(str_a);
return 0;}
确实是您要调试的代码,gcc
可能足够聪明,可以将您的代码简化为printf("Hello world\n"); return 0
,或者只是使用内置的strcpy
。
因此,尝试一下--no-builtin
,也许-O0
,它至少正在发挥作用gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
。
您可以使用objdump -d prog
来查看代码的反汇编,这里没有调用strcpy
。
对于这个问题
您正在使用break 7
,但该行是空的,使用break 8
应该可以。