1

Linux で作業してクラッシュ ハンドラ関数を構築しようとしています - クラッシュする前にログ ファイルにスタック トレースを取得するため - いくつかの調査を行った結果、-g/-rdynamic フラグを使用してデバッグ情報を生成し、glibc バックトレースを使用するかのいずれかであることがわかりました/ スタックトレースを取得する backtrace_symbols_fd 関数 ...

私のアプリのようにあまり使用されていないため、 -g/-rdynamic フラグの使用は許可されていません。

期待どおりに動作しない次のコードをビルドしましたが、生成されたログ ファイルでは次のエラーで終了します。

(gdb) Hangup detected on fd 0
error detected on stdin
A debugging session is active.

Inferior 1 [process 6625] will be detached.
Quit anyway? (y or n) [answered Y; input not from terminal]
Detaching from program: /u/vivek/demo/testprg, process 6625

コード: 起動時にクラッシュ ハンドラー関数を次のように登録します。

struct sigaction act;
memset(&act, 0, sizeof (act));
act.sa_sigaction = ProcessCrash;
sigfillset (&act.sa_mask);
act.sa_flags = SA_SIGINFO;
sigaction (SIGSEGV, &act, NULL);

私のプログラムがSIGSEGVシグナルを受信したときに呼び出される次の関数-

void ProcessCrash( int signal, siginfo_t * siginfo, void *context)
{
    cerr <<"** ProcessCrash –Handler Function**" << endl;
       ucontext_t *uc = (ucontext_t *)context;


       if (signal == SIGSEGV)
              fprintf(stderr, "\nGot signal %d, faulty address is %p, "
                     "from %p\n\n", signal, siginfo->si_addr, 
                            uc->uc_mcontext.gregs[REG_RIP]);  // REG_EIP is changed to REG_RIP for –m64 arch.
       else
              fprintf(stderr, "Got signal %d#92;\n", signal);

      // [[ using GDB to pring the stack trace

       char gdb[516];

    // command 1
    //sprintf(gdb, "echo 'where\ndetach' | gdb -q %.256s -pid %d > gdbTest.dump", program_invocation_name, getpid());

    // command 2
    sprintf(gdb, "(echo \"source Trace.txt\";cat) | gdb -q %.256s -pid %d > gdbTest.dump", program_invocation_name, getpid());

    fprintf(stderr, "\n** GDB Command-> %s \n", gdb);
    // output of above is 
    //  ** GDB Command-> (echo "source Trace.txt";cat) | gdb -q /u/vivek/demo/testprg -pid 6625 > gdbTest.dump

    // Run Either command 1 or command 2  but we get the same result
        system(gdb);

      // GDB test ]]


       // Produce a core dump 
       abort();

       return; 
}

Trace.txt の内容:

set logging on
where
detach
quit

それを克服する方法があるかどうか教えてください...私はそれを克服するためのアイデアを得ていないので..

4

1 に答える 1