从一个线程跟踪另一个线程

2024-03-05

进行实验ptrace()系统调用,我试图跟踪同一进程的另一个线程。根据手册页,跟踪器和被跟踪者都是特定的线程(而不是进程),所以我看不出它不应该工作的原因。到目前为止,我已经尝试了以下方法:

  • use PTRACE_TRACEME来自clone()d child:调用成功,但没有执行我想要的操作,可能是因为要跟踪的线程的父级不是调用的线程clone()
  • use PTRACE_ATTACH or PTRACE_SEIZE来自父线程:这总是失败EPERM,即使该进程以 root 身份运行并使用prctl(PR_SET_DUMPABLE, 1)

在所有情况下,waitpid(-1, &status, __WALL)失败了ECHILD(与显式传递子 pid 时相同)。

我应该怎么做才能让它发挥作用?

如果根本不可能,是设计使然还是内核中的错误(我使用的是 3.8.0 版本)。在前一种情况下,您能给我指出文档的正确部分吗?


正如 @mic_e 指出的,这是关于内核的已知事实 - 不完全是一个错误,但也不完全正确。请参阅内核邮件列表主题。 http://yarchive.net/comp/linux/ptrace_self_attach.html提供 Linus Torvalds 的摘录:

那张“新”(去年 11 月)支票不太可能消失。解决了so许多问题(安全性和稳定性),并考虑到

(a) 一年内,只有两个人曾经达到过noticed

(b) 有一个如上所述的解决方法,该解决方法并不是非常具有侵入性

我不得不说,为了真正回到原来的行为, 我们必须有人关心我们deeply,返回并检查每个 单一特殊情况、死锁和竞争。

解决方案是实际启动在子进程中跟踪的进程 - 您需要使 ptracing 进程成为另一个进程的父进程。

这是基于以下内容的概述:我写的另一个答案 https://stackoverflow.com/a/30092189/3369324:

// this number is arbitrary - find a better one.
#define STACK_SIZE (1024 * 1024)

int main_thread(void *ptr) {
    // do work for main thread
}

int main(int argc, char *argv[]) {
    void *vstack = malloc(STACK_SIZE);
    pid_t v;
    if (clone(main_thread, vstack + STACK_SIZE, CLONE_PARENT_SETTID | CLONE_FILES | CLONE_FS | CLONE_IO, NULL, &v) == -1) { // you'll want to check these flags
        perror("failed to spawn child task");
        return 3;
    }
    long ptv = ptrace(PTRACE_SEIZE, v, NULL, NULL);
    if (ptv == -1) {
        perror("failed monitor sieze");
        return 1;
    }
    // do actual ptrace work
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从一个线程跟踪另一个线程 的相关文章

  • 为什么在谈论线程和进程时,“不要同时格式化软盘”的评论很有趣?

    我正在阅读之间的区别线程和进程 https stackoverflow com questions 200469 what is the difference between a process and a thread并在第二个答案中发现
  • 断点会停止所有线程吗?

    如果我的程序中有两个线程同时运行 并在其中一个线程上设置了断点 那么当遇到此断点时 另一个线程也会停止 还是会继续执行 我用 Java 编写并使用 NetBeans 断点可以选择它们的行为方式 挂起单个线程或所有线程
  • 张量流和线程

    下面是来自 Tensorflow 网站的简单 mnist 教程 即单层 softmax 我尝试通过多线程训练步骤对其进行扩展 from tensorflow examples tutorials mnist import input dat
  • 在 Python 中打印守护线程异常

    Python 不会打印守护线程中引发的异常的回溯消息 例如 以下代码创建一个守护线程并在新线程中引发异常 def error raiser raise Exception import threading thread threading
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • 异步回调在哪个线程上运行?

    我正在做几个HttpWebRequest BeginGetResponse调用 并在回调方法中BeginGetResponse 我正在调用一个事件处理程序 在EventHandler中 有测试下载是否成功的逻辑 如果没有 它会尝试重新下载
  • 这是 C# 的有效、惰性、线程安全的 Singleton 实现吗?

    我实现了这样的单例模式 public sealed class MyClass public static MyClass Instance get return SingletonHolder instance static class
  • 导致崩溃转储的 Java 错误的解决方法

    我开发的一个程序偶尔会由于这个错误而导致 JVM 崩溃 http bugs java com bugdatabase view bug do bug id 8029516 http bugs java com bugdatabase vie
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • 调用线程无法访问该对象,因为另一个线程拥有它

    我已经阅读了很多关于此错误的帖子 但我不明白如何在我的解决方案中解决它 我有一个进度条对话框 其中包含一些逻辑 通过按钮单击从 MainFrame 调用 void OnBtnClick object sender RoutedEventAr
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • 使用/不使用 delegate() 启动线程

    有什么区别 new Thread new ThreadStart SomeFunc and new Thread delegate SomeFunc 这段代码在我的计算机上给出了奇怪的输出 public class A int Num pu
  • 如果在睡眠线程上调用interrupt()会发生什么?

    我有一个线程 然后run I call sleep 如果我中断这个线程会发生什么 MyThread extends Thread public void run try sleep 1000000 catch InterruptedExce
  • numba 函数何时编译?

    我正在研究这个例子 http numba pydata org numba doc 0 15 1 examples html multi threading http numba pydata org numba doc 0 15 1 ex
  • 通过 ruby​​ 进程共享变量

    我正在编写一个 gem 其中我必须分叉两个进程来启动两个 webrick 服务器 我想通过基类的类方法启动该服务器 因为应该只运行这两个服务器 而不是多个服务器 在运行时 我想调用这两台服务器上的一些方法来更改变量 我的问题是 我无法通过基
  • Condition 接口中的 signalAll 与对象中的 notificationAll

    1 昨天我才问过这个问题条件与等待通知机制 https stackoverflow com questions 10395571 condition vs wait notify mechanism 2 我想编辑相同的内容并在我的问题中添加
  • 如何在进入新活动之前终止线程和处理程序

    大家好 在我尝试清理处理程序时 这段代码可能有点混乱 因为我一直在尝试追踪崩溃发生的位置 我有一个对话框活动 显示密码输入 进度条由线程和处理程序动画显示 似乎当我试图查看进度条是否完成并尝试终止线程时 当我尝试进入新活动时 我这样做的方式
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 是否有一种更简单的方法可以并行运行命令,同时在 Windows PowerShell 中保持高效?

    此自我回答旨在为那些受困于 Windows PowerShell 并由于公司政策等原因而无法安装模块的用户提供一种简单且高效的并行替代方案 在 Windows PowerShell 中 built in可用的替代方案local并行调用是St

随机推荐

  • Azure Sql 中的 Active Directory(AD) 身份验证不起作用

    我正在尝试让 Azure AD 身份验证针对我的 Azure SQL 数据库工作 我创建了一个 PaaS 数据库及其关联的 PaaS Sql Server 我将我的 Azure AD 帐户分配为 PaaS Sql Server 的 Acti
  • 在 iOS 上估计到 iBeacon 的距离

    我正在尝试估计从 iOS 设备到 iBeacon 的距离 我知道距离估计不是非常准确 而且我也知道这个公式 https electronics stackexchange com questions 83354 calculate dist
  • 我的数据触发绑定有什么问题?

    我创建了一个附加属性来扩展具有附加状态的 Button 类
  • HttpSession request.getSession(false)

    我有个问题 在我的servlet在 glassfish 中我称之为方法request getSession false 它应该return null 但相反 总是有一个session回 而且 如果我invalidate the sessio
  • docker构建发布插件出错

    你能帮我配置一下吗jenkins docker 构建发布插件 https wiki jenkins ci org display JENKINS Docker build publish Plugin 我已经为 docker repo 设置
  • ImageIO.read(getClass().getResourceAsStream (input==NULL) 出现错误?

    当我使用以下代码时 我不断收到此错误 try image ImageIO read getClass getResourceAsStream build classes javaproject Space gif catch IOExcep
  • int 变量的大小

    int的大小是如何决定的 int 的大小是否真的取决于处理器 对于 32 位机器 它是 32 位 对于 16 位机器 它是 16 在我的机器上 它显示为 32 位 尽管该机器安装了 64 位处理器和 64 位 Ubuntu 这取决于实施 C
  • 如何使用 Flutter 下载文件并将其存储在 Downloads 文件夹中

    我正在使用 Flutter 1 10 3 构建一个应用程序 但将图像下载到设备的下载文件夹时遇到困难 是否可以选择在不使用任何第三部分库的情况下执行此操作 添加一些必需的依赖项 我有一个仅适用于 android 的测试演示 请查阅file
  • Node.js 文档未定义

    为什么node js无法识别document GetElementById 它说 ReferenceError 文档未定义 我能做些什么 ReferenceError document is not defined at Object
  • 如何从 ISBN 号获取书名? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正计划为我的个人藏书创建一个小型网站 为了稍微自动化该过程 我想创建以下功能 该网站会询问我该书的 ISBN 号 然后自动获取书名并
  • 如何中止使用 ThreadPool.QueueUserWorkItem 创建的线程

    有没有办法中止使用 QueueUserWorkItem 创建的线程 或者也许我不需要 如果主应用程序退出会发生什么 从它创建的所有线程都会自动中止吗 你不需要中止它们 当您的应用程序退出时 NET 将终止 IsBackground true
  • ld-linux --验证退出代码

    检查 usr bin ldd 的源代码 我发现它使用 ld linux 来查找可执行文件的依赖项 尽管它首先使用 verify 参数调用 ld linux 然后 脚本根据 ld linux verify 调用的退出代码采取不同的行为 ld
  • HTML5画布,保存jpeg blob并从blob恢复到画布

    我有一块画布 mycanvas其中包含图像 我想从该图像创建一个斑点 最好是 jpeg 格式 这是我创建 blob 的方法 document getElementById mycanvas toDataURL image jpeg repl
  • 比较数组与 jQuery [重复]

    这个问题在这里已经有答案了 可能的重复 javascript中数组交集的最简单代码 https stackoverflow com questions 1885557 simplest code for array intersection
  • 检查 TCP 端口是否可用(未侦听或连接)

    我使用以下代码来检查端口是否可用 bool ClassA CheckPortTCP short int dwPort char ipAddressStr struct sockaddr in client int sock client s
  • 在 C# 中调用 google Url Shortener API

    我想打电话给谷歌网址缩短API http code google com apis urlshortener v1 getting started html从我的 C 控制台应用程序中 我尝试实现的请求是 POST https www go
  • Firestore - 查询时如何在字段上应用“字符串包含”条件?

    Collection Post postId post 124 title World population 2020 如何编写一个查询 返回 标题 字段中包含字符串 世界人口 的帖子 Firestore 不支持此级别的查询 看全文检索 h
  • 从 iOS 应用程序检测附近的移动设备

    是否可以创建一个 iOS 应用程序来扫描附近的移动设备 例如 iPhone Android iPad 等 而无需在附近的移动设备上运行任何自定义应用程序 我尝试过像这样使用 CoreBluetooth 在我的 iPhone 6 上运行 se
  • 如何创建数据类型不是 EMF 类的 EAttribute?

    使用 EMF 我想定义一个属性 其数据类型 EType 在我的 EMF 模型外部 也就是说 我想要的类型是一个普通的手工编码的 Java 类 它不是我的 EMF 模型的一部分 使用AnySimpleType是最后的手段 与使用泛型相比 我想
  • 从一个线程跟踪另一个线程

    进行实验ptrace 系统调用 我试图跟踪同一进程的另一个线程 根据手册页 跟踪器和被跟踪者都是特定的线程 而不是进程 所以我看不出它不应该工作的原因 到目前为止 我已经尝试了以下方法 use PTRACE TRACEME来自clone d