- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在 Linux 64 位下开发一个小调试器,我在查找系统调用的返回值时遇到了问题,
我正在测试 RIP 值,我的意思是我执行 PEEK_USERDATA 并且 ptrace 直接通过这种方式给我返回操作码而不是 RIP 地址(其中 0x050f 是 SYSCALL 的操作码):
if (rip & 0x0000ffff == 0x050f)
然后获取系统调用名称参数等
问题是我如何获得这些系统调用的返回值,我知道 ptrace 提供 PTRACE_SYSCALL 来警告我们进入/离开内核模式,但我想直接检查 RIP 值,所以我使用 SINGLESTEP ,我检查了我的 rip 是否匹配 SYSLEAVE 和 SYSEXIT 操作码,但它从来没有。我可以检查返回值的唯一方法实际上是检查我的 orig_rax,但我不会通过这种方式获得 exit_group retval。
我知道 Linux ABI 希望将返回值存储在 RAX 中,但我不知道如何见证返回用户空间。
谢谢。
最佳答案
您不能跟踪内核,因此如果您在 SYSCALL 停止后执行另一个 PTRACE_SINGLESTEP 或 PTRACE_SYSCALL,它将执行系统调用并在返回后停止在下一条指令。此时,您可以检查寄存器以查看系统调用的返回值是什么。
关于c - 使用 SINGLESTEP 通过 ptrace 获取返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10543444/
我正在尝试使用 ptrace API 跟踪一个小程序。我发现每次运行跟踪器时,都会产生不好的结果。这是我要跟踪的短程序的反汇编: $ objdump -d -M intel inc_reg16 inc
我正在 Linux 64 位下开发一个小调试器,我在查找系统调用的返回值时遇到了问题, 我正在测试 RIP 值,我的意思是我执行 PEEK_USERDATA 并且 ptrace 直接通过这种方式给我返
我是一名优秀的程序员,十分优秀!