How to get a stack trace for C++ using gcc with line number information?

后端 未结 14 2017
长发绾君心
长发绾君心 2020-11-27 09:54

We use stack traces in proprietary assert like macro to catch developer mistakes - when error is caught, stack trace is printed.

I find gcc\'s pair

14条回答
  •  执念已碎
    2020-11-27 10:54

    Here's an alternative approach. A debug_assert() macro programmatically sets a conditional breakpoint. If you are running in a debugger, you will hit a breakpoint when the assert expression is false -- and you can analyze the live stack (the program doesn't terminate). If you are not running in a debugger, a failed debug_assert() causes the program to abort and you get a core dump from which you can analyze the stack (see my earlier answer).

    The advantage of this approach, compared to normal asserts, is that you can continue running the program after the debug_assert is triggered (when running in a debugger). In other words, debug_assert() is slightly more flexible than assert().

       #include 
       #include 
       #include  
    
    // note: The assert expression should show up in
    // stack trace as parameter to this function
    void debug_breakpoint( char const * expression )
       {
       asm("int3"); // x86 specific
       }
    
    #ifdef NDEBUG
       #define debug_assert( expression )
    #else
    // creates a conditional breakpoint
       #define debug_assert( expression ) \
          do { if ( !(expression) ) debug_breakpoint( #expression ); } while (0)
    #endif
    
    void recursive( int i=0 )
       {
       debug_assert( i < 5 );
       if ( i < 10 ) recursive(i+1);
       }
    
    int main( int argc, char * argv[] )
       {
       rlimit core_limit = { RLIM_INFINITY, RLIM_INFINITY };
       setrlimit( RLIMIT_CORE, &core_limit ); // enable core dumps
       recursive();
       }
    

    Note: Sometimes "conditional breakpoints" setup within debuggers can be slow. By establishing the breakpoint programmatically, the performance of this method should be equivalent to that of a normal assert().

    Note: As written, this is specific to the Intel x86 architecture -- other processors may have different instructions for generating a breakpoint.

提交回复
热议问题