调试器如何在 Linux 中工作?

Sen*_*Sen 7 linux debugging

调试器如何在 Linux 中工作?它如何“附加”到已经运行的可执行文件或进程。我知道编译器将代码翻译成机器语言,但是调试器如何“知道”它所附加的内容?

str*_*ika 10

有一个名为ptrace的系统调用。它需要 4 个参数:操作、目标进程的 PID、目标进程内存中的地址和数据指针。最后两个参数的使用方式取决于操作。

例如,您可以将调试器附加/分离到进程:

ptrace(PTRACE_ATTACH, pid, 0, 0);
...
ptrace(PTRACE_DETACH, pid, 0, 0);
Run Code Online (Sandbox Code Playgroud)

单步执行:

ptrace(PTRACE_ATTACH, pid, 0, 0);
int status;
waitpid(pid, &status, WSTOPPED);
while (...) {
    ptrace(PTRACE_SINGLESTEP, pid, 0, 0);
    // give the user a chance to do something
}
ptrace(PTRACE_DETACH, pid, 0, 0);
Run Code Online (Sandbox Code Playgroud)

您还可以使用 PTRACE_PEEKDATA 和 PTRACE_POKEDATA 读取/写入目标进程的内存。如果您想查看真实示例,请查看gdb