如何检查第三个 API 是否在 Linux 中为 c/c++ 程序创建了一个新线程?

How to check if a 3rd API create a new thread for c/c++ program in linux?

本文关键字:创建 程序 c++ 一个 线程 新线程 Linux 检查 何检查 三个 是否      更新时间:2023-10-16

只是想问一下有什么方法可以检查第三个 API 是否会在 Linux 中为 c/c++ 程序创建一个新线程?如下所示,假设do_something_API是第三个 API 并且我们不知道实现,那么如何知道该功能是否会创建一个新线程?使用 gdb 或其他工具?

int main() {
...
//call 3rd party API
do_something_API();
...
}

如何知道功能是否会创建一个新线程?

只需在 gdb 中main函数中的do_something_API()行停止,然后使用next命令一次即可执行do_something_API()函数。如果该函数创建任何新线程,您将看到来自 gdb 的消息,例如:

[New Thread 0x41e02940 (LWP 25582)]

请参阅文档中:

每当 GDB 在程序中检测到新线程时,它都会显示 目标系统对线程的标识,其中有一条消息 形式 '[New systag]',其中 systag 是一个线程标识符,其形式 因特定系统而异。例如,在 GNU/Linux 上, 您可能会看到

[新线程0x41e02940 (LWP 25582(]

如何知道功能是否会创建一个新线程?

  1. 您可能遇到 XY 问题。你到底想实现什么?
  2. 阅读文档或询问第三方开发人员。如果他们承诺永远不会创建线程,那么这就是答案。否则,假设它们可以(如果不是在当前版本中,那么在下一个版本中(。
  3. 您可以运行nm libsomething.{a,so} | grep pthread_createstrings libsomething.{a,so} | grep pthread_create。如果这两个命令都没有产生任何输出,则可以非常确定当前版本的库不会创建新线程。
  4. 如果在 GDB 下运行测试程序,并通过do_something_API()调用next,GDB 将使用类似于[New thread ...]的消息报告新线程创建。如果您没有看到此类消息,则表示未创建新线程。

    您还可以在pthread_create上设置断点,或者在调用前后使用info thread

    注意:如果没有创建新线程,这是一个非常的指标:do_something_API()可能会根据运行时环境(例如环境变量、当前目录或一天中的时间(决定是否创建新线程,因此下次运行测试时,答案可能会改变。

您可以尝试在 gdb 中运行代码并使用"info threads"查看程序中所有正在运行的线程。

或者您也可以使用/proc/进行检查