问题标签 [ptrace]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
5430 浏览

linux - 如何仅使用 ptrace(linux,x86/x86_64)获取“回溯”(如 gdb)

backtrace我想像gdb 一样获得类似的输出。但我想ptrace()直接通过。我的平台是Linux,x86;以及后来的 x86_64。

现在我只想从堆栈中读取返回地址,而不转换为符号名称。

因此,对于测试程序,在-O0模式下编译gcc-4.5

我将启动一个我的程序并ptrace在一开始就连接到测试程序。然后,我将执行 PTRACE_CONT 并等待信号。什么时候测试程序会做自杀;信号将传递给我的程序。此时我想读取返回地址,它们将是这样的(因为kill此时函数处于活动状态):

如何找到当前停止的测试过程的返回地址ptrace?帧上会有循环吗?我应该什么时候停止这样的循环?

PS:是的,这也很像idea中的backtrace(3)libc函数,但我想通过ptrace在外部执行此操作。

0 投票
1 回答
4551 浏览

linux - ptrace 和线程

我正在开发一个包含 ptrace 的 linux 应用程序来观察另一个进程的线程。当我观察到的应用程序派生一个子进程时,这已经很好地工作了。通过在我的应用程序中调用 waitpid,我可以在观察应用程序中获得以下信号:

  • SIGSTOP形成子进程
  • SIGTRAP来自父母

为了跟踪所有孩子,我使用PTRACE_O_TRACEFORK、和.PTRACE_O_TRACEVFORKPTRACE_O_TRACECLONEPTRACE_O_TRACEEXIT

虽然子进程一切正常,但我无法观察应用程序的线程。我SIGTRAP从创建线程的过程中得到了,但我没有从线程中得到任何信号。

线程和有什么特别之处ptrace吗?如何strace跟踪线程(我在 的代码中找不到任何专用于线程的特殊例程strace)?

这是我ptrace在我的应用程序中使用的方式:

  • 首先,我附加到一个过程:ptrace(PTRACE_ATTACH, pid, NULL, NULL);
  • 然后,我打电话waitpid()trace_pid = waitpid(-1, &status, 0);
  • 设置ptrace选项:ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXIT);

附加到pid后,我正在waitpid()循环调用并调用. 当然,我会在事件处理之后继续这些任务。ptrace(PTRACE_SETOPTIONS...ptraceSIGCONT

0 投票
2 回答
3907 浏览

c - 如何在 x86-64 上使用 ptrace?

我在这里按照教程进行了一些修改x86-64(基本上将 eax 替换为 rax 等),以便它编译:

但它实际上并没有按预期工作,它总是说:

代码有什么问题?

0 投票
1 回答
1514 浏览

c - 为什么 WIFSIGNALED(status) 在使用 ptrace 跟踪进程时无法检测到信号?

我正在使用 ptrace 来跟踪子进程。当子进程正常退出时,它工作得很好。但是如果它异常退出,尽管使用了宏 WIFSIGNALED(&status),程序仍会进入无限循环。这是示例子进程:

尝试.c

这是跟踪程序

为什么没有检测到在不使用 ptrace 时有效的信号?

0 投票
3 回答
4604 浏览

c - 为什么这个 ptrace 程序说 syscall 返回 -38?

除了我在跑步之外,它和这个一样execl("/bin/ls", "ls", NULL);

结果显然是错误的,因为每个系统调用都返回-38

有人知道原因吗?

更新

现在的问题是:

execve退货0 两次,为什么?

0 投票
2 回答
987 浏览

linux - Single step a process by one assembly instruction

When you execute a single step operation using ptrace does the process do one "line" of code or does it do one line of assembly instead. If it's the former case is there a way to step a process in linux by one processor instruction only?

I mean to do this within the kernel but the GDB source is kind of large and it's hard to track exactly what it's doing to do it's ASM singlestepping. I want to single step a process it's just that I'm not sure what the exact behavior of ptrace's single step is (just 1 instruction or more?)

0 投票
2 回答
4532 浏览

c - 为什么 ptrace SINGLESTEP 不能正常工作?

我正在尝试使用 ptrace API 跟踪一个小程序。我发现每次运行跟踪器时,都会产生不好的结果。这是我要跟踪的短程序的反汇编:

这是示踪剂本身的代码:

跟踪器的工作是单步执行 inc_reg16 程序并记录每个遇到的处理器指令的地址。当我运行并检查遇到指令“inc ax”的次数时,每次运行跟踪器时数字都不同:

第二次检查:

问题是上面的结果都应该是 65536,因为指令“inc ax”被执行了 65536 次。现在的问题是:我的代码中有错误还是 ptrace 中的一些错误问题?非常感谢您的帮助。

0 投票
1 回答
636 浏览

c - ptrace mprotect 调试麻烦

我在一个研究项目上遇到了麻烦。我想要的是使用 ptrace 来观察目标进程的执行。在 ptrace 的帮助下,我将 mprotect 系统调用注入目标代码段(类似于断点)并将堆栈保护设置为 PROT_NONE。之后我恢复原始指令并让目标继续。当我得到一个无效的许可段错误时,我再次注入系统调用以再次取消保护堆栈,然后我执行导致段错误的指令并再次保护堆栈。

(这确实适用于简单的程序。)

我现在的问题是,通过这种设置,目标(相当)在库函数调用中随机崩溃(无论我使用动态链接还是静态链接)。通过崩溃,我的意思是,它要么尝试访问由于某种原因未映射的内存,要么它只是一直挂在函数中__lll_lock_wait_private(这是在 malloc 调用之后)。

让我再次强调,崩溃并不总是发生,也不总是发生在相同的位置。

这听起来像是一个同步问题,但据我所知(意思是我查看了/proc/pid/tasks/)只有一个线程在运行。

那么你知道这可能是什么原因吗?即使您不确定,也请告诉我您的建议,我的想法已经不多了...

0 投票
2 回答
1410 浏览

linux - 从进程上下文中的内核中的 Ptrace 单步?

我想知道如果从内核(在本例中为 Linux)您在进程上下文(系统调用、页面错误等)中使用 PTRACE_SINGLESTEP 调用 ptrace_request 会发生什么。它会单步执行用户空间指令还是内核空间指令。我意识到 ptrace 只能执行单步用户指令,这就是为什么我对这会产生的行为感到好奇的原因。

只是为了提供更多信息,我试图从页面错误处理程序中执行此操作(单步错误的指令但更改 PTE 以便指令通过)。我想知道这是否可能,或者它是否需要另一种方法来做到这一点,例如重新安排进程运行等....

出现这种情况是因为进程的 task_struct(如果被抢占)仍将指向内核空间处理程序 IIRC,因此使用 ptrace 单步执行是否会绕过此并执行正确的用户空间指令,或者根本不执行?

0 投票
4 回答
4223 浏览

linux - 在 Linux 中禁用 vsyscall

我正在开发一个使用 ptrace(2) 监视其他进程的系统调用的软件。不幸的是,大多数现代操作系统都实现了某种快速的用户模式系统调用,在 Linux 中称为vsyscalls

有没有办法禁止对单个进程使用 vsyscalls/vDSO,或者,如果不可能,对整个操作系统禁用?