我知道mmap是一个系统调用,但glibc中必须有一些包装器来执行系统调用。 然而当我尝试使用gdb来遍历我的程序中的mmap函数时, gdb忽略它,因为它找不到任何源文件(注意我从源代码编译自己的glibc)。 我可以通过其他glibc库函数,如printf和malloc而不是mmap 。 我也使用了flag -fno-builtin,以便gcc不使用内置函数。 任何帮助,将不胜感激。
我不知道你的问题是什么 它对我来说工作得很好。
使用系统libc.so.6
,安装调试符号:
// mmap.c #include <sys/mman.h> int main() { void *p = mmap(0, 4096, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); return 0; } gcc -g mmap.c $ gdb -q a.out Reading symbols from /tmp/a.out...done. (gdb) start Temporary breakpoint 1 at 0x40052c: file mmap.c, line 5. Temporary breakpoint 1, main () at mmap.c:5 5 void *p = mmap(0, 4096, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); (gdb) step mmap64 () at ../sysdeps/unix/syscall-template.S:82 82 ../sysdeps/unix/syscall-template.S: No such file or directory. (gdb) mmap64 () at ../sysdeps/unix/syscall-template.S:83 83 in ../sysdeps/unix/syscall-template.S (gdb) main () at mmap.c:6 6 return 0; (gdb) q
使用我自己的glibc构建:
gdb -q a.out Reading symbols from /tmp/a.out...done. (gdb) start Temporary breakpoint 1 at 0x40056c: file mmap.c, line 5. warning: Could not load shared library symbols for linux-vdso.so.1. Do you need "set solib-search-path" or "set sysroot"? Temporary breakpoint 1, main () at mmap.c:5 5 void *p = mmap(0, 4096, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); (gdb) step mmap64 () at ../sysdeps/unix/syscall-template.S:81 81 T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS) (gdb) mmap64 () at ../sysdeps/unix/syscall-template.S:82 82 ret (gdb) main () at mmap.c:6 6 return 0; (gdb) q