【问题标题】:How to check if a 3rd API create a new thread for c/c++ program in linux?如何检查第三个 API 是否为 linux 中的 c/c++ 程序创建了一个新线程?
【发布时间】:2020-09-27 04:23:15
【问题描述】:

只是想问有没有什么方法可以检查第三个 API 是否会为 linux 中的 c/c++ 程序创建一个新线程?如下,假设 do_something_API 是第 3 个 API,我们不知道实现,那么如何知道函数是否会创建一个新线程?使用 gdb 或其他工具?

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

【问题讨论】:

  • 我确信有一种方法可以枚举当前正在运行的进程中的所有线程(这意味着您可以计算它们)。在之前和之后执行此操作,并检查是否有差异。当然,检查文档!并联系第三方库的作者!
  • 附加调试器也可以

标签: c++ linux multithreading gdb


【解决方案1】:

如何知道函数是否会创建一个新线程?

  1. 您可能有一个XY problem。你到底想达到什么目标?
  2. 阅读文档或询问第 3 方开发人员。如果他们承诺从不创建线程,那就是答案。否则,假设它们可能(如果不在当前版本中,则在下一个版本中)。
  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() 可能会根据运行时环境(例如环境变量或当前目录或一天中的时间),因此下次运行测试时,答案可能会改变。

【讨论】:

    【解决方案2】:

    如何知道函数是否会创建一个新线程?

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

    [New Thread 0x41e02940 (LWP 25582)]
    

    in documentation:

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

    [新线程 0x41e02940 (LWP 25582)]

    【讨论】:

      【解决方案3】:

      您可以尝试在 gdb 中运行代码并使用“信息线程”查看程序中所有正在运行的线程。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多