Nic*_*ckB 6 c stack multithreading solaris call
在Solaris 10上的C中,我想从进程中的任意线程获取调用堆栈.
我有许多工作线程和一个线程,它们监视它们以检测紧密循环和死锁.我想要实现的功能是监视线程在杀死它之前多次从"挂起"线程打印调用堆栈.
我知道如何通过监视线程执行pstack(使用system()或forking)来实现这一点.但是我希望能够在C中实现这个功能.有没有办法做到这一点?
我知道如何让一个线程打印其OWN调用堆栈,通过遍历堆栈,如果它遇到一个断言很有用,但不知道如何在同一个进程中为另一个线程执行此操作.
谢谢你的帮助.NickB
如果您使用 gcc,则可以使用内置函数 __builtin_return_address。void * __builtin_return_address(无符号整型级别)
该函数返回调用该函数的函数的地址。即函数的调用者。
level 指定了多少个级别。0表示当前函数,1表示调用者,2表示调用者调用者。下面的例子将提供用法。通过打印函数的地址,可以确定调用堆栈。
int calla()
{
printf("Inside calla\n");
printf("A1=%x\n",__builtin_return_address (0));
printf("A2=%x\n",__builtin_return_address (1) );
printf("A3=%x\n",__builtin_return_address (2) );
}
int callb()
{
printf("Inside callb\n");
calle();
printf("B1=%x\n",__builtin_return_address (0) );
printf("B2=%x\n",__builtin_return_address (1) );
printf("B3=%x\n",__builtin_return_address (2) );
}
int callc()
{
printf("Inside callc\n");
printf("C1=%x\n",__builtin_return_address (0) );
printf("C2=%x\n",__builtin_return_address (1) );
printf("C3=%x\n",__builtin_return_address (2) );
}
int calld()
{
printf("Inside calld\n");
printf("D1=%x\n",__builtin_return_address (0) );
printf("D2=%x\n",__builtin_return_address (1) );
printf("D3=%x\n",__builtin_return_address (2) );
}
int calle()
{
printf("Inside calle\n");
printf("E1=%x\n",__builtin_return_address (0) );
printf("E2=%x\n",__builtin_return_address (1) );
printf("E3=%x\n",__builtin_return_address (2) );
}
main()
{
printf("Address of main=%x calla=%x callb=%x callc=%x calld=%x calle=%x\n",main,calla,callb,callc,calld,calle);
calla();
callb();
calld();
}
Run Code Online (Sandbox Code Playgroud)