- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 PTRACE_SEIZE
来跟踪子进程的执行,但我遇到了一个问题,即非组停止 PTRACE_EVENT_STOP
(信号 = = SIGTRAP
) 当被跟踪者收到一个 SIGCONT
时被发射。我似乎找不到任何可能表明发生这种情况的文档。根据我在 ptrace(2)
联机帮助页中收集到的内容,PTRACE_EVENT_STOP
仅在以下条件之一为真时发生:
ptrace(PTRACE_INTERRUPT, ...)
SIGSTOP
、SIGTSTP
、SIGTTIN
或SIGTTOU
)<fork
/vfork
/clone
,tracer自动附加到新进程/线程在下面的示例程序中,我得到一个带有信号 SIGTRAP
的 PTRACE_EVENT_STOP
,但它不符合这 3 个条件中的任何一个。当我运行该程序时,我得到以下输出:
[Child] Raising SIGSTOP
Event for pid 29236: Tracee entered group-stop PTRACE_EVENT_STOP (signal: 19)
Event for pid 29236: Tracee entered non-group-stop PTRACE_EVENT_STOP (signal: 5)
Event for pid 29236: Tracee entered/exited syscall
Event for pid 29236: Tracee entered/exited syscall
Event for pid 29236: Tracee received signal (signal: 18)
Event for pid 29236: Tracee entered/exited syscall
[Child] Resumed from SIGSTOP
Event for pid 29236: Tracee entered/exited syscall
Event for pid 29236: Tracee entered/exited syscall
Event for pid 29236: Process exited
关于这个特定的 PTRACE_EVENT_STOP
意味着什么的任何想法?
示例程序:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <unistd.h>
static void handle_events(pid_t pid_spec)
{
while (1) {
int status;
pid_t pid = waitpid(pid_spec, &status, __WALL);
printf("Event for pid %d: ", pid);
if (WIFEXITED(status)) {
printf("Process exited\n");
break;
} else if (WIFSIGNALED(status)) {
printf("Process killed by signal\n");
break;
} else if (WIFSTOPPED(status)) {
int ptrace_event = status >> 16;
int signal = WSTOPSIG(status);
switch (ptrace_event) {
case PTRACE_EVENT_STOP:
if (signal == SIGSTOP || signal == SIGTSTP
|| signal == SIGTTIN || signal == SIGTTOU) {
printf("Tracee entered group-stop PTRACE_EVENT_STOP (signal: %d)\n", signal);
ptrace(PTRACE_LISTEN, pid, NULL, NULL);
} else {
printf("Tracee entered non-group-stop PTRACE_EVENT_STOP (signal: %d)\n", signal);
ptrace(PTRACE_SYSCALL, pid, NULL, 0);
}
break;
default:
if (signal == (SIGTRAP | 0x80)) {
printf("Tracee entered/exited syscall\n");
ptrace(PTRACE_SYSCALL, pid, NULL, 0);
} else {
printf("Tracee received signal (signal: %d)\n", signal);
ptrace(PTRACE_SYSCALL, pid, NULL, signal);
}
break;
}
}
}
}
int main()
{
pid_t pid = fork();
if (pid == 0) {
printf("[Child] Raising SIGSTOP\n");
// Allow parent to PTRACE_SEIZE
if (raise(SIGSTOP) != 0) {
_exit(255);
}
printf("[Child] Resumed from SIGSTOP\n");
_exit(0);
}
// Wait for stop
int status;
waitpid(pid, &status, WSTOPPED);
ptrace(PTRACE_SEIZE, pid, NULL, PTRACE_O_TRACESYSGOOD);
// Allow child to continue
kill(pid, SIGCONT);
handle_events(pid);
return EXIT_SUCCESS;
}
strace
似乎在看到非组停止 PTRACE_EVENT_STOP
时调用 PTRACE_SYSCALL
:
最佳答案
我设法找出事件发生的原因。
当进程被 PTRACE_SEIZE
追踪时, ptrace_trap_notify()
将被调用到set JOBCTL_TRAP_NOTIFY
什么时候 SIGCONT
is received或 JOBCTL_TRAP_STOP
将在 stopping signal is received 时设置. get_signal()
将检查 JOBCTL_TRAP_MASK
(即 JOBCTL_TRAP_STOP | JOBCTL_TRAP_NOTIFY
)和 call do_jobctl_trap()
. do_jobctl_trap()
然后将发送 <stopping signal> | (PTRACE_EVENT_STOP << 8)
如果进程进入组停止,否则它将发送 SIGTRAP | (PTRACE_EVENT_STOP << 8)
.
因此,当使用 PTRACE_SEIZE
时:
<stopping signal> | (PTRACE_EVENT_STOP << 8)
事件SIGCONT
信号将导致 SIGTRAP | (PTRACE_EVENT_STOP << 8)
事件此行为似乎已在 commit fb1d910c178ba0c5bc32d3e5a9e82e05b7aad3cd
中引入.
关于c - 为什么当被跟踪者收到 SIGCONT 时会发生 SIGTRAP PTRACE_EVENT_STOP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49354408/
我有一个静态类。 static class AppDirectory { public static string PACSTEMP = Path.Combine(Path.GetTempPa
我已经设置了一个启用了推送通知的 iOS 应用。 我可以将消息推送到应用程序,例如角标(Badge)计数工作并相应更新。 但我从未在锁屏或其他地方看到标准的推送通知弹出窗口,但手机会振动,因此消息会通
我们有一个带有 Web 应用程序和一堆 Windows 服务的系统,它们在做一些后台工作。 每当我们需要对系统进行更实质性的更改时,我们最终不得不发出 IIS 重置,然后手动重新启动所有相关的 Win
我有以下几行 John SMith: A Pedro Smith: B Jonathan B: A John B: B Luis Diaz: A Scarlet Diaz: B 我需要获得所有获得
我正在编写一个 Java 客户端(在 weblogic 10.3 上)来调用一个安全的网络服务。我已获得安装在 cacerts、DemoIdentity.jks 和 DemoTrust,jks 中的客
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
我正在尝试调用void方法addToList,该方法将通过用户传递给它的两个字符串除外。我检查了dataSource类,以确保它确实接受了那些作为参数。问题是我在该方法调用上始终收到标识符>预期错误,
我的任务:使用scanner方法从一行数据中提取字符串、 float 和整数。 数据格式为: Random String, 240.5 51603 Another String, 41.6 59087
这个问题已经有答案了: What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it? (25 个回答)
首先我实例化一个游戏状态 class GameState extends state{ ArrayList levels; int currentLevelID; public GameState()
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我有一个实现为单例的 Controller 对象,它有一个可以随时驱逐对象的缓存。当一个对象即将被删除时,我想通知任何使用此 Controller 的类,以便它们能够做出适当的响应。我对这种行为的第一
因此,我尝试跨集群发送消息,该消息将包含一个 User 对象,该对象是一个可序列化类。 当我发送 String 或 int 时,它工作正常,消息发送没有问题,并且集群上的所有 channel 都收到它
我试图创建的程序是一个基本游戏,用户输入网格大小,选择 block 接收增加分数的奖品、从分数中夺走分数的强盗或结束游戏的炸弹。我收到堆栈流错误,但我不明白为什么? 抱歉,代码量很大,我只是无法找到问
使用此代码我会得到什么ConcurrentModificationException?我有一个同步(监听器)锁。 private void notifyListeners(MediumRenditio
我想在捕获 DeadlineExceededError 后正确退出。我还剩下多少钱来清理? 例如, try: do_some_work() except DeadlineExceededError
我有 2 个 Intranet 站点: http://intranetv1/ http://intranetv2/ v1基于.NET 1.1,v2基于.NET 3.5 在 v1 上,我创建了一个网页,
我有一个在 Linux 3.12 上运行的 C 程序。该程序产生几个子进程。其中一个进程会生成一个线程,该线程运行一段时间然后终止。当该子进程运行时,它会执行 epoll_wait()。 epoll_
我能够将 APNS 集成到我的应用程序中。现在我想在用户点击它或用户在使用应用程序时收到通知时处理通知。我使用下面的代码在收到通知时显示警报对话框: func application(applicat
当我试图在浏览器上运行这段代码时,出现了以下错误。"错误响应错误代码:501消息:不支持的方法(“POST”)。错误码解释:501-服务器不支持该操作。" 浏览器控制台出现以下错误: "1.加载资源失
我是一名优秀的程序员,十分优秀!