Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Sep 16, 2010, 1:45:08 PM (14 years ago)
Author:
landauf
Message:

show file name and line number in the call stack (works only with msvc)
hack-fix for wrong call stack when calling some "noreturn" functions (e.g. _assert())
some cleanup

Location:
code/trunk/src/libraries/util
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • code/trunk/src/libraries/util/SignalHandler.cc

    r7455 r7457  
    3737#include <cstdlib>
    3838#include <cstring>
     39
    3940#include "Debug.h"
    4041
     
    344345
    345346#ifdef ORXONOX_COMPILER_GCC
     347/// Overwrite the original abort() function in MinGW to enable a break point.
    346348_UtilExport void __cdecl abort()
    347349{
     
    352354}
    353355
     356/// Overwrite the original _abort() function in MinGW to enable a break point.
    354357_UtilExport void __cdecl _assert(const char* expression, const char* file, int line)
    355358{
     
    391394            // Install the unhandled exception filter function
    392395            this->prevExceptionFilter_ = SetUnhandledExceptionFilter(&SignalHandler::exceptionFilter);
    393 
    394 //            std::set_terminate(&myterminate);
    395 /*
    396 #ifdef ORXONOX_COMPILER_GCC
    397             MODULEENTRY32 module;
    398             memset(&module, 0, sizeof(MODULEENTRY32));
    399             module.dwSize = sizeof(MODULEENTRY32);
    400 
    401             HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0);
    402 
    403             BOOL result = Module32First(snapshot, &module);
    404 
    405             COUT(0) << SignalHandler::pointerToString((unsigned)_assert) << std::endl;
    406 
    407             while (result)
    408             {
    409                 COUT(0) << module.szModule << std::endl;
    410                 COUT(0) << SignalHandler::pointerToString((unsigned)module.modBaseAddr) << " / " << SignalHandler::pointerToString(*module.modBaseAddr) << std::endl;;
    411 
    412                 FARPROC procAssert = GetProcAddress(module.hModule, "__ZSt13set_terminatePFvvE");
    413                 if (procAssert)
    414                 {
    415                     COUT(0) << "yes1 --------------------------------------------------------" << std::endl;
    416                     COUT(0) << SignalHandler::pointerToString((unsigned)procAssert) << std::endl;
    417                     // *(volatile unsigned*)procAssert = 0xcc;
    418                 }
    419 
    420                 result = Module32Next(snapshot, &module);
    421             }
    422 
    423 //            *(volatile unsigned*)abort = 0xcc;
    424 //            *(volatile unsigned*)_assert = 0xcc;
    425 #endif
    426 */
    427396        }
    428397    }
     
    606575
    607576            // Get the symbol information from the address of the instruction pointer register:
    608             if
     577            bool bCorrected = false;
     578            BOOL result = SymFromAddr
    609579            (
    610                 SymFromAddr
     580                GetCurrentProcess() ,   // Process to get symbol information for
     581                frame.AddrPC.Offset ,   // Address to get symbol for: instruction pointer register
     582                &displacement       ,   // Displacement from the beginning of the symbol
     583                symbol                  // Where to save the symbol
     584            );
     585
     586            // If the symbol was found, but the displacement is 0, we likely got the wrong symbol - decrease the program counter and try again
     587            if (result && displacement == 0)
     588            {
     589                bCorrected = true;
     590                result = SymFromAddr
    611591                (
    612                     GetCurrentProcess() ,   // Process to get symbol information for
    613                     frame.AddrPC.Offset ,   // Address to get symbol for: instruction pointer register
    614                     &displacement       ,   // Displacement from the beginning of the symbol
    615                     symbol                  // Where to save the symbol
    616                 )
    617             )
     592                    GetCurrentProcess()     ,
     593                    frame.AddrPC.Offset - 1 ,
     594                    &displacement           ,
     595                    symbol
     596                );
     597            }
     598
     599            // Display the function name + offset
     600            if (result)
    618601            {
    619602                // Add the name of the function to the function list:
     
    635618
    636619                output += " +" + SignalHandler::pointerToString(displacement, false);
     620                if (bCorrected)
     621                    output += " (?)";
    637622            }
    638623
    639 /*
    640             IMAGEHLP_MODULE64 module;
    641             memset(&module, 0, sizeof(IMAGEHLP_MODULE64));
    642             module.SizeOfStruct = sizeof(IMAGEHLP_MODULE64);
     624            output += "\n";
     625
     626            // Get the file name and line number
     627            IMAGEHLP_LINE64 line;
     628            memset(&line, 0, sizeof(IMAGEHLP_LINE64));
     629            line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
     630
     631            DWORD displacement2 = 0;
    643632
    644633            if
    645634            (
    646                 SymGetModuleInfo64
     635                SymGetLineFromAddr64
    647636                (
    648637                    GetCurrentProcess(),
    649                     frame.AddrPC.Offset,
    650                     &module
     638                    frame.AddrPC.Offset - bCorrected ? 1 : 0,
     639                    &displacement2,
     640                    &line
    651641                )
    652642            )
    653643            {
    654                 IMAGEHLP_LINE64 line;
    655                 memset(&line, 0, sizeof(IMAGEHLP_LINE64));
    656                 line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
    657 
    658                 DWORD displacement2 = displacement;
    659 
    660                 if
    661                 (
    662                     SymGetLineFromAddr64
    663                     (
    664                         GetCurrentProcess(),
    665                         frame.AddrPC.Offset,
    666                         &displacement2,
    667                         &line
    668                     )
    669                 )
    670                 {
    671                     output += "\n";
    672                     output += "               ";
    673                     output += line.FileName;
    674                     output += ":";
    675                     output += multi_cast<std::string>(line.LineNumber);
    676                 }
     644                output += "               ";
     645                output += line.FileName;
     646                output += ":";
     647                output += multi_cast<std::string>(line.LineNumber);
     648                output += "\n";
    677649            }
    678 */
    679             output += "\n";
    680650        }
    681651
  • code/trunk/src/libraries/util/SignalHandler.h

    r7455 r7457  
    4040#include <cassert>
    4141#include <string>
     42
    4243#include "Singleton.h"
    4344#include "SpecialConfig.h"
     
    7273    {
    7374        friend class Singleton<SignalHandler>;
    74     public:
    75         SignalHandler()  { }
    76         ~SignalHandler() { }
    7775
    78         void registerCallback( SignalCallback cb, void * someData );
     76        public:
     77            void registerCallback( SignalCallback cb, void * someData );
    7978
    80         void doCatch( const std::string & appName, const std::string & filename );
    81         void dontCatch();
     79            void doCatch( const std::string & appName, const std::string & filename );
     80            void dontCatch();
    8281
    83     private:
    84         static void sigHandler( int sig );
     82        private:
     83            static void sigHandler( int sig );
    8584
    86         void catchSignal( int sig );
    87         SignalRecList sigRecList;
     85            void catchSignal( int sig );
     86            SignalRecList sigRecList;
    8887
    89         SignalCallbackList callbackList;
     88            SignalCallbackList callbackList;
    9089
    91         static SignalHandler* singletonPtr_s;
     90            static SignalHandler* singletonPtr_s;
    9291
    93         std::string appName;
    94         std::string filename;
     92            std::string appName;
     93            std::string filename;
    9594    };
    9695}
Note: See TracChangeset for help on using the changeset viewer.