如何获取启动线程的方法或函数地址?

Posted

技术标签:

【中文标题】如何获取启动线程的方法或函数地址?【英文标题】:How to the get method or function adress which launched a thread? 【发布时间】:2015-07-18 10:31:49 【问题描述】:

我想获取运行由其线程 ID 标识的线程的函数/方法的地址或名称。

如何使用 Windows API 做到这一点?我正在使用win7 x64。 我尝试在 windows api 中查找文档失败了...

【问题讨论】:

我感觉信息没有存储在任何地方 - 在调试器 [或足够称职的进程查看器] 中,您可能可以向下钻取堆栈,直到找到第一个调用,但除此之外, “原始线程起始地址”没有被存储[它肯定不在我熟悉的任何线程库代码中] 当然,如果它是您的软件,您可以随时将 std::thread 包装到另一个包含额外信息的对象中... 跟踪很混乱。无论用于存储名称/线程 ID 映射的容器都需要一个锁,以便可以安全地执行线程创建/终止时的插入/删除。锁必须在迭代时被保留。存在返回过时信息的危险。我会非常努力地不按照你的建议去做。 当然可以。就像我说的,遍历堆栈,你最终会找到对 MS 提供的线程创建函数的调用,该函数调用了线程启动函数。但是没有公开可用的 API,您必须对 CreateThread 调用进行逆向工程或检测。 函数名称甚至不会保留在可执行文件中(调试版本除外),因此您要求的是不可能的。编写你自己的 CreateThread 包装器,它需要一个字符串来与线程相关联。 【参考方案1】:

您需要实现此功能,因为 Windows API 不提供它。

【讨论】:

以上是关于如何获取启动线程的方法或函数地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用字典修复多线程/多处理?

java runnable线程如何传参?

什么叫线程id号?怎么获取?

Linux如何自动获取IP地址及配置静态IP地址上网

如何在多线程函数MFC中获取对话框类的指针

如何获取用户定义函数的地址?