6

Solaris 10 の C で、プロセス内の任意のスレッドからコール スタックを取得したいと考えています。

多くのワーカー スレッドと、それらすべてを監視してタイトなループとデッドロックを検出する 1 つのスレッドがあります。私が実装したい関数は、監視スレッドが「ハングした」スレッドから呼び出しスタックを数回印刷してから、それを強制終了することです。

監視スレッドに pstack を実行させることでこれを実装する方法を知っています (system() またはフォークによって)。しかし、私はこの関数を C で実装できるようにしたいと考えています。これを行う方法はありますか?

スレッドがアサートにヒットした場合に役立つスタックをウォークすることにより、スレッドが独自の呼び出しスタックを出力する方法を知っていますが、同じプロセス内の別のスレッドに対してこれを行う方法は知りません。

助けてくれてありがとう。ニックB

4

2 に答える 2

3

gcc を使用している場合は、組み込み関数 __builtin_return_address を使用できます。void * __builtin_return_address (unsigned int レベル)

関数は、関数が呼び出された関数のアドレスを返します。つまり、関数の呼び出し元です。

レベルは、レベル数を指定します。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();
}
于 2009-08-21T13:40:48.730 に答える