C语言 在ubuntu中设置断点

6za6bjd0  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(168)

我开始在ubuntu 22.04中用C开发自己的调试器x86。我不明白调试器如何知道在内存中的何处设置int 3(0xCC).比如,如果我想在第10行设置断点,我怎么才能知道第10行的内存地址是什么.还有,内存地址是RAM中的虚拟地址?我看到一些选项其中一些是查找IP寄存器:

/* Get value of EIP (instruction pointer) */
struct user_regs_struct regs;
ptrace(PTRACE_GETREGS, child_pid, NULL, &regs);
long eip = regs.rip;            //rip is ip register to 64 bit

/* Calculate address of breakpoint */
long bp_addr = eip - 1;
printf("Breakpoint hit at address 0x%lx\n", bp_addr);

我还看到了一个通过GDB调试器使用的选项:break,然后将返回最接近的可执行指令到我的行号,但我如何使用任何行号,而不是手动,以及它是如何意味着最接近的可执行指令?感谢帮助!

tuwxkamq

tuwxkamq1#

当您编译启用调试符号(cc -g ...)的可执行文件时,编译器会在该二进制文件中嵌入各种元数据,这些元数据描述变量和函数,并包含有关源代码行的信息。
gdb读取此元数据,以便允许您执行诸如列出代码或在特定行/函数处设置断点之类的操作。
如果你正在编写自己的调试器,并希望提供相同的功能,你需要引入对阅读此元数据的支持。有关如何存储此元数据的介绍,请参阅Wikipedia article on DWARF

相关问题