簡體   English   中英

信號處理程序內部的回溯

[英]Backtrace inside Signal Handler

我想從下面的代碼這篇文章有信號處理程序打印錯誤回溯如浮點和段故障。 我將seg故障信號用作起點。 這是代碼:

#include <cstdlib>      //for exit()
#include <signal.h>     //signal handling   
#include <execinfo.h>   //backtrace, backtrace_symbols and backtrace_fd
#include <iostream>
#include <string.h>
#include <stdio.h>

#define TRACE_MSG fprintf(stderr, "TRACE at: %s() [%s:%d]\n", \
        __FUNCTION__, __FILE__, __LINE__)

void show_stackframe()
{
    void *trace[1024];
    char **messages = (char **) NULL;
    int i, trace_size = 0;
    TRACE_MSG;
    trace_size = backtrace(trace, 1024);    // segfault here???
    // More code here to print backtrace, but not needed at the moment..
    TRACE_MSG;
}

void sigSegvHandler( int signum, siginfo_t* info, void* arg )
{
    TRACE_MSG;
    show_stackframe();
    return;
}

double func_b()
{
    show_stackframe();  // Show that backtrace works without being 
                    // called inside sighandler.

    TRACE_MSG;
    int int_a[5];
    int_a[0] = 4;
    int_a[11] = 10;         // cause a segfault on purpose to see
                    // how the signal handling performs.

    return 1.1;
}

int main()
{
    // Examine and change the seg fault signal
    struct sigaction segvAction;   // File: /usr/include/bits/sigaction.h

   // Initialize segvAction struct to all zeros for initialiation
   memset( &segvAction,  0, sizeof( segvAction ) );

   segvAction.sa_sigaction = sigSegvHandler;
   segvAction.sa_flags = SA_SIGINFO;    //Invoke signal catching function with 3 arguments instead of 1

   // Set the action for the SIGSEGV signal
   sigaction( SIGSEGV, &segvAction,  NULL );

   func_b();    // Produce a SIGSEGV error
}

我正在使用以下代碼進行編譯:

 g++ -rdynamic testprogram.cpp -o testprogram

我從程序收到以下輸出:

TRACE at: show_stackframe() [stackoverflow.cpp:15]
TRACE at: show_stackframe() [stackoverflow.cpp:17]
TRACE at: func_b() [stackoverflow.cpp:33]
TRACE at: sigSegvHandler() [stackoverflow.cpp:22]
TRACE at: show_stackframe() [stackoverflow.cpp:15]
Segmentation fault

我的問題是,為什么show_stackframe()會在sigaction內導致分段錯誤,但在不在sigaction處理程序內時能正常工作? 我顯然似乎在設置信號處理程序/操作不正確,但是我整天都找不到它。 在這種情況下,GDB似乎沒有任何幫助。

如所陳述在這里 ,所述backtrace功能是AS-不安全,這意味着它是不安全的從異步信號處理程序調用。 這樣做會引起未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM