调试器如何在 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。
| 归档时间: |
|
| 查看次数: |
2698 次 |
| 最近记录: |