- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个类似“调试器”的应用程序,名为 hyper-ptrace
。它启动使用 NPTL 的多线程 user_appl3
。
hyper-ptrace 的主循环是:
wait3(&status, FLAGS, &u);
// find a pid of child, which has a signal
switch (signal = WSTOPSIG(status))
{
case SIGTRAP:
do_some_analysis_of_the_child(pid, &status) // up to several ms
break;
}
ptrace(PTRACE_CONT, pid); // discard signal, user_appl3 doesn't know anything
//about this SIGTRAP
SIGTRAP 由硬件以某个周期性间隔为每个线程为 user_appl3 生成,并传递给某个线程。间隔可以是 100..1 毫秒甚至更短。它是一种带有中断的 per-CPU 时钟。每个线程仅在其 CPU 上运行(通过关联绑定(bind))。
于是就有了问题1:
如果线程 1 得到 TRAP 并且调试器进入 do_some_analysis_of_the_child
,(因此调试器不会为第二个线程执行 wait3
),并且稍后线程 2 也得到 TRAP, Linux内核会做什么?
在我看来:thread1 将被停止,因为它收到一个信号并且有一个等待调试器。但是 thread2 继续运行(是吗?)。当 thread2 收到信号时,将不会有等待的调试器,因此 TRAP 可以传递给 thread2 本身,从而有效地杀死它。 我说得对吗?
还有第二个问题,question2:
对于这种情况,我应该如何重写 hyper-ptrace
的主循环,以降低将信号传递给用户的机会线程,通过调试器?陷阱生成硬件和用户应用程序都不能更改。停止第二个线程也不是变体。
我需要分析这两个线程。一些 it 部分只有在线程停止时才能完成。
提前致谢!
最佳答案
不,信号没有传送到应用程序。子应用程序将在信号发生时停止,并且您的 ptracing 进程将在下次调用
wait()
时收到通知。
你是对的 - 跟踪停止只适用于主线程。
要获得您想要的行为,在跟踪线程停止后通过向进程 PID 发送 SIGSTOP
立即挂起整个子进程(每个线程),并使用 SIGCONT 恢复它
完成后:
wait3(&status, FLAGS, &u);
if (WIFSTOPPED(status))
kill(pid, SIGSTOP); /* Signal entire child process to stop */
switch (signal = WSTOPSIG(status))
{
case SIGTRAP:
do_some_analysis_of_the_child(pid, &status) // up to several ms
break;
}
ptrace(PTRACE_CONT, pid, 0, 0); // discard signal, user_appl3 doesn't know anything about this SIGTRAP
kill(pid, SIGCONT); /* Signal entire child process to resume */
关于linux - ptrace'ing 多线程应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3523708/
有人添加到 Wikipedia "ptrace" article声称在 Linux 上,一个 ptraced 进程本身不能 ptrace 另一个进程。我正在尝试确定是否(如果是,为什么)是这种情况。下
我的 Linux 守护程序有问题。它以 root 权限开始,进行一些配置,然后通过切换到某个用户和组来永久删除权限并继续工作。切换到非特权用户是这样完成的: void switch_to_user_g
在 ptrace 上发了很多问题之后(最近的 5 个问题是我的 :( )我终于在替换时得到了想要的输出 reg_val[1] = ptrace(PTRACE_PEEKDATA, child, 4 *
来自手册页: PTRACE_GET_SYSCALL_INFO (since Linux 5.3) Retrieve information about the system call that cau
我的Linux守护程序有问题。它从root特权开始,进行一些配置,然后通过切换到某些用户和组永久放弃特权并继续工作。切换到非特权用户的操作如下: void switch_to_user_group(s
目前,对于一个项目,我需要使用 ptrace() 编写某种调试器。最后,它应该显示程序中进入/退出的每个函数/系统调用以进行跟踪。 现在,我被困住了。我制作了一个小程序,它应该尝试跟踪给定的程序,并根
考虑这个无限循环的简单程序: int main(void) { for(;;); } 使用 ptrace 向其中注入(inject)系统调用非常简单,如下所示: #include #
我有以下代码。它只是在进入无限循环之前调用 ptrace(PTRACE_TRACEME)。 我有两个问题: 执行二进制文件后,即使我是 root,我也无法附加 gdb。 使用 ptrace(PTRAC
我正在使用 Go 的系统调用包 Ptrace 接口(interface)来跟踪进程。问题是,如果被跟踪者长时间运行,跟踪似乎会挂起。我尝试用 C 实现复制这个问题,但一切似乎都运行良好。 这是重现该问
我只想跟踪 C 程序的一部分以进行系统调用。我使用 ptrace() 和 PTRACE_TRACEME 选项来开始跟踪。如何在几行代码后阻止此进程被跟踪。我正在尝试使用 PTRACE_DETACH 但
ptrace 可以在进入/退出系统调用时获取寄存器和内存数据。但是,如果 linux 系统调用处理程序更改了一些内存,包括堆栈中的某个位置,我如何才能知道哪个内存已被更改。 最佳答案 你不能;但例如
我想在 Linux 上跟踪 PIE,例如在给定的指令地址中断。从反汇编中,我得到了指令的相对地址 - 如何找出可执行文件的加载位置,以便获得绝对地址? GDB 能够跟踪 PIE - 它是如何处理的?
我想使用 ptrace() 调用从用户定义的函数中捕获信息。 但是函数地址不稳定(因为ASLR)。 如何以编程方式获取另一个程序的函数信息,例如gdb? #include #include #in
我在研究项目上遇到了问题。我正在尝试的是使用 ptrace 来观察目标进程的执行。在 ptrace 的帮助下,我将 mprotect 系统调用注入(inject)目标代码段(类似于断点)并将堆栈保护设
我正在尝试使用 ptrace 实现数据流异常检测。经过一些研究,我实现了一个类似于 strace 的程序。现在,我对此感到困惑,这就是 wiki 告诉我的关于系统调用的内容: "System call
我以 ./main & 运行我的进程 它给了我一个看起来像这样的地址:[1] 4257 然后在一个新的终端上我这样做:./tracer 4257 这行代码返回-1 ptrace(PTRACE_ATTA
我正在编写一个程序来监视系统调用(除其他外)。但是我在让 ptrace 识别我传递给它的进程 ID 时遇到了一些麻烦。执行程序后,我收到此错误消息: :No such process 但是,我已经在调
当我附加到另一个进程时,我无法跟踪 fork/exec 事件,从 waitpid 返回的 status 始终为零(在右移 16 次之后)。 我已经成功附加到 bash shell,但是无论我运行什么命
我想按以下方式(伪代码)使用 ptrace: child : foo(); now that foo is done parent should use ptrace to chang
我正在尝试使用 ptrace 在运行时更改另一个程序变量,在我的例子中是一个虚拟 shell。 int main(void) { char buf[MAXLINE]; fgets
我是一名优秀的程序员,十分优秀!