所以,我有以下c程序:
#include <stdio.h>
#include <string.h>
int main(){
char arr[20];
//this is line 6
strcpy(arr,"Hello, world!\n");
printf(arr);
}
我使用以下命令编译它:
gcc -g t2.c -o a2.out
之后我将它加载到gdb并尝试在第6行,strcpy函数和第8行设置断点。果然,当在strcpy设置断点时,我得到以下消息:&#34;使断点挂起未来的共享库负载? (y或[n])&#34;。我回答说#34; y&#34;并得到了#34; Breakpoint 2(strcpy)等待。&#34;。
在回答是,并运行程序之后,断点2永远不会被解析,调试器会直接跳转到printf上的Breakpoint 3。
我在调试器中使用Intel语法。除此之外没有自定义设置。任何人都可以告诉为什么strcpy的断点永远不会被解决?
答案 0 :(得分:0)
诸如gcc之类的编译器对诸如strcpy
之类的字符串函数的语义非常熟悉。
在您的示例的x86-64上,即使在以下位置,gcc 9也会生成内联汇编而不是strcpy
调用
-O0
。断点应可用于大多数其他功能。
用gcc-9生成的x86-64反汇编(无strcpy调用):
0000000000000000 <main>:
0: 48 83 ec 28 sub rsp,0x28
4: 48 b8 48 65 6c 6c 6f 2c 20 77 movabs rax,0x77202c6f6c6c6548
e: bf 01 00 00 00 mov edi,0x1
13: 48 89 04 24 mov QWORD PTR [rsp],rax
17: b8 21 0a 00 00 mov eax,0xa21
1c: 48 89 e6 mov rsi,rsp
1f: 66 89 44 24 0c mov WORD PTR [rsp+0xc],ax
24: 31 c0 xor eax,eax
26: c7 44 24 08 6f 72 6c 64 mov DWORD PTR [rsp+0x8],0x646c726f
2e: c6 44 24 0e 00 mov BYTE PTR [rsp+0xe],0x0
33: e8 00 00 00 00 call 38 <main+0x38> 34: R_X86_64_PLT32 __printf_chk-0x4
38: 31 c0 xor eax,eax
3a: 48 83 c4 28 add rsp,0x28
3e: c3 ret