问题描述
遇到问题步入文件string.h
广发行7.5。这里有一个简单的示例程序:
Having trouble stepping into string.h
in GDB 7.5. Here's a simple example program:
来源$ C $ C:
#include <stdio.h>
#include <string.h>
int main() {
char str1[20];
strcpy(str1, "STEP INTO ME\n");
printf(str1);
}
编译: 〜$ gcc的-g foo.c的
调用: 〜$ GDB -q ./a.out
GDB:
(gdb) break 5
Breakpoint 1 at 0x8048471: file foo.c, line 6.
(gdb) break strcpy
Function "strcpy" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (strcpy) pending.
(gdb) run
Starting program: /home/user/a.out
Breakpoint 1, main () at foo.c:6
6 strcpy(str_a, "Hello, world!\n");
(gdb) step
7 printf(str_a);
我不应该在此时字符串库?相反,它继续在printf()的。
Shouldn't I be in the string library at this point? Instead it continues to the printf().
编辑:
斯科特的建议,但没有按预期的方式工作。
Scott's suggestion "worked", but not in the expected manner.
Breakpoint 1, main () at foo.c:6
6 strcpy(str_a, "Hello, world!\n");
(gdb) i r $eip
eip 0x80484a1 0x80484a1 <main+21>
(gdb) step
Breakpoint 2, __strcpy_ssse3 () at ../sysdeps/i386/i686/multiarch/strcpy-ssse3.S:78
78 ../sysdeps/i386/i686/multiarch/strcpy-ssse3.S: No such file or directory.
(gdb) i r $eip
eip 0xb7e9c820 0xb7e9c820 <__strcpy_ssse3>
我在目录吃惊 78
...预计是这样的: / lib中/.../ CMOV / libc.so。 6
。并声称没有这样的文件或目录。
I am surprised at the directory in 78
... expected something like: /lib/.../cmov/libc.so.6
. And the claim that there is no such file or directory.
推荐答案
与重新编译code GCC -fno-内置-g foo.c的
和GDB 步
命令将工作。 (请参阅)。否则,小的strcpy()
,的memcpy()
电话经常会被翻译成开放codeD数据移动的指令,例如在X86-64:
Recompile your code with gcc -fno-builtin -g foo.c
and the gdb step
command will work. (See -fno-builtin documentation). Otherwise small strcpy()
, memcpy()
calls would often be translated into open coded data movement instructions, e.g. on x86-64:
4 int main() {
0x000000000040052c <+0>: push %rbp
0x000000000040052d <+1>: mov %rsp,%rbp
0x0000000000400530 <+4>: sub $0x20,%rsp
5 char str1[20];
6 strcpy(str1, "STEP INTO ME\n");
0x0000000000400534 <+8>: lea -0x20(%rbp),%rax
0x0000000000400538 <+12>: movl $0x50455453,(%rax)
0x000000000040053e <+18>: movl $0x544e4920,0x4(%rax)
0x0000000000400545 <+25>: movl $0x454d204f,0x8(%rax)
0x000000000040054c <+32>: movw $0xa,0xc(%rax)
7 printf(str1);
0x0000000000400552 <+38>: lea -0x20(%rbp),%rax
0x0000000000400556 <+42>: mov %rax,%rdi
0x0000000000400559 <+45>: mov $0x0,%eax
0x000000000040055e <+50>: callq 0x400410 <printf@plt>
8 }
0x0000000000400563 <+55>: leaveq
0x0000000000400564 <+56>: retq
您可以看到 strpcy()
呼叫被编译成多 MOV 的说明。
You can see the strpcy()
call being compiled into multiple MOV instructions.
GCC -fno-内置
编译相同的程序为:
4 int main() {
0x000000000040057c <+0>: push %rbp
0x000000000040057d <+1>: mov %rsp,%rbp
0x0000000000400580 <+4>: sub $0x20,%rsp
5 char str1[20];
6 strcpy(str1, "STEP INTO ME\n");
0x0000000000400584 <+8>: lea -0x20(%rbp),%rax
0x0000000000400588 <+12>: mov $0x400660,%esi
0x000000000040058d <+17>: mov %rax,%rdi
0x0000000000400590 <+20>: callq 0x400450 <strcpy@plt>
7 printf(str1);
0x0000000000400595 <+25>: lea -0x20(%rbp),%rax
0x0000000000400599 <+29>: mov %rax,%rdi
0x000000000040059c <+32>: mov $0x0,%eax
0x00000000004005a1 <+37>: callq 0x400460 <printf@plt>
8 }
0x00000000004005a6 <+42>: leaveq
0x00000000004005a7 <+43>: retq
,你可以看到调用&LT; strcpy的@ PLT方式&gt;
假设你想踏入的strcpy()
来研究其实施,你想为libc.so安装调试信息。不幸的是拿到调试信息的方式Linux发行版之间的区别。在Fedora安装debuginfo软-的glibc 作为一样简单。这需要在Ubuntu和Debian更多的步骤。这页面有链接为Fedora,Ubuntu和Debian的说明(搜索 debuginfo软)
Assuming you wanted to step into strcpy()
to study its implementation, you'd want to have debug info for libc.so installed. Unfortunately the way to get debug info differs between Linux distros. On Fedora it's as simple as debuginfo-install glibc
. It takes more steps on Ubuntu and Debian. This RPM DPKG Rosetta Stone page have links to instructions for Fedora, Ubuntu and Debian (search for debuginfo).
既然你在Ubuntu 12.10,实际上希望看到的strcpy()
汇编源$ C $ C:
Since you're on Ubuntu 12.10 and actually want to see the strcpy()
assembly source code:
$ sudo apt-get install libc6-dbg
$ sudo apt-get source libc6-dev
$ gdb ./a.out
(gdb) directory eglibc-2.15/sysdeps
Source directories searched: /home/scottt/eglibc-2.15/sysdeps:$cdir:$cwd
(gdb) break strcpy
Breakpoint 1 at 0x400450
(gdb) run
Starting program: /home/scottt/a.out
Breakpoint 1, __strcpy_sse2 () at ../sysdeps/x86_64/multiarch/../strcpy.S:32
32 movq %rsi, %rcx /* Source register. */
这篇关于不能踏入同GDB string.h函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!