只是想问一下有什么方法可以检查第三个 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(]
如何知道功能是否会创建一个新线程?
- 您可能遇到 XY 问题。你到底想实现什么?
- 阅读文档或询问第三方开发人员。如果他们承诺永远不会创建线程,那么这就是答案。否则,假设它们可以(如果不是在当前版本中,那么在下一个版本中(。
- 您可以运行
nm libsomething.{a,so} | grep pthread_create
和strings libsomething.{a,so} | grep pthread_create
。如果这两个命令都没有产生任何输出,则可以非常确定当前版本的库不会创建新线程。 -
如果在 GDB 下运行测试程序,并通过
do_something_API()
调用next
,GDB 将使用类似于[New thread ...]
的消息报告新线程创建。如果您没有看到此类消息,则表示未创建新线程。您还可以在
pthread_create
上设置断点,或者在调用前后使用info thread
。注意:如果没有创建新线程,这是一个非常弱的指标:
do_something_API()
可能会根据运行时环境(例如环境变量、当前目录或一天中的时间(决定是否创建新线程,因此下次运行测试时,答案可能会改变。
您可以尝试在 gdb 中运行代码并使用"info threads"查看程序中所有正在运行的线程。
或者您也可以使用/proc/进行检查