Exemple #1
0
int BinaryFile::Init(char *filename)
{
	Destroy();

	bfd_init();

	_abfd = bfd_openr(filename, NULL); 
	if (_abfd == NULL) { 
		perror("bfd_openr");
		return -1;
	} 
	bfd_boolean ret = bfd_check_format(_abfd, bfd_object);
	if (ret == false) { 
		perror("bfd_check_format_matches");
		return -2;
	}

	int result = InitSymbols(_symbols, SYM_FUNC);
	if (result < 0) {
		fprintf(stderr, "get symbols error!\n");
		return -3;
	}
	result = InitRelsym(_rels);
	if (result < 0) {
		fprintf(stderr, "get rels error!\n");
		return -3;
	}
	return 0;
}
LONG WINAPI GetCrashReason(LPEXCEPTION_POINTERS ep)
{
	if (!ep)
		return EXCEPTION_CONTINUE_EXECUTION;

	if (IsBadReadPtr(ep, sizeof(EXCEPTION_POINTERS)))
		return EXCEPTION_CONTINUE_EXECUTION;

#ifdef _DEBUG
	InitSymbols();

	DWORD dwLineDisp = 0;
	IMAGEHLP_LINE64 crashline = { sizeof(IMAGEHLP_LINE64), NULL, 0, NULL, 0 };

	if (SymGetLineFromAddr64(GetCurrentProcess(), (DWORD64)ep->ExceptionRecord->ExceptionAddress, &dwLineDisp, &crashline))
	{
		char msg[2048];
		sprintf(msg, "file: %s  line: %i", crashline.FileName, (int)crashline.LineNumber);
		MessageBox(NULL, msg, "An error has occurred", MB_OK | MB_ICONSTOP);
	}
	else
		MessageBox(NULL, "Unknown error", "An error has occurred", MB_OK | MB_ICONSTOP);

	KillSymbols();
#endif
#if 0
	Gamma_Restore();
#endif
	return EXCEPTION_EXECUTE_HANDLER;
}
TDSPPsk::TDSPPsk(char   *name, 
		 Int_t   num,
		 UInt_t  opt) : TDSPSymbolGenerator(name, num, opt){

  // Book for num symbols
  //
  BookSymbols(num);
  InitSymbols();
}
Exemple #4
0
main(int argc,char **argv)
{
 progname= argv[0];             /*Get the program name */
 inpf= InitParser(argc,argv);
 if (!inpf) exit(1);            /*Abort in case of illegal input file */
 LineSeek(0);                   /*Position on the begin of a file */
 InitSymbols(predef_sym);       /*Create the symbols table */
 yyparse();                     /*Do parsing */
 Main(argc,argv);               /*User applied 'main' program */
 exit(0);
}
Exemple #5
0
void ClassicLadder_InitAllDatas( void )
{
	InitVars();
#ifdef OLD_TIMERS_MONOS_SUPPORT
	InitTimers();
	InitMonostables();
#endif
	InitCounters();
	InitTimersIEC();
	InitArithmExpr();
	InitRungs();
	InitSections( );
#ifdef SEQUENTIAL_SUPPORT
	InitSequential( );
#endif
	InitSymbols( );
}
int StackTrace::GetCallStack(void* vcontext, Address* callStack, int maxDepth, 
                             int entriesToSkip)
{
    uintptr_t* ebpReg;
    uintptr_t espReg;
    __asm mov [ebpReg], ebp
    __asm mov [espReg], esp

    InitSymbols();

    STACKFRAME64 stackFrame;
    memset(&stackFrame, 0, sizeof(stackFrame));

    PCONTEXT context = (PCONTEXT)vcontext;
    if (context == 0)
    {
        stackFrame.AddrPC.Offset    = ebpReg[1];
        stackFrame.AddrFrame.Offset = ebpReg[0];
        stackFrame.AddrStack.Offset = espReg;
    }
    else
    {
        InitStackFrameFromContext(context, stackFrame);
    }
    stackFrame.AddrPC.Mode      = AddrModeFlat;
    stackFrame.AddrFrame.Mode   = AddrModeFlat;
    stackFrame.AddrStack.Mode   = AddrModeFlat;

    HANDLE process  = GetCurrentProcess();
    HANDLE thread   = GetCurrentThread(); 

    int numEntries(0);
    while (::StackWalk64(IMAGE_FILE_MACHINE_I386, process, thread, 
        &stackFrame, context, 0, SymFunctionTableAccess64, SymGetModuleBase64, NULL) &&
        stackFrame.AddrFrame.Offset != 0 && numEntries < maxDepth)
    {
        if (entriesToSkip > 0)
            --entriesToSkip;
        else
            callStack[numEntries++] = reinterpret_cast<Address>(stackFrame.AddrPC.Offset);
    }
    return numEntries;
}
Exemple #7
0
bool appSymbolName(address_t addr, char *buffer, int size)
{
	InitSymbols();

	char SymBuffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME];
	PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)SymBuffer;
	pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
	pSymbol->MaxNameLen   = MAX_SYM_NAME;

	DWORD64 dwDisplacement = 0;
	if (SymFromAddr(hProcess, addr, &dwDisplacement, pSymbol))
	{
		char OffsetBuffer[32];
		if (dwDisplacement)
			appSprintf(ARRAY_ARG(OffsetBuffer), "+%X", dwDisplacement);
		else
			OffsetBuffer[0] = 0;

#if EXTRA_UNDECORATE
		char undecBuffer[256];
		if (UnDecorateSymbolName(pSymbol->Name, ARRAY_ARG(undecBuffer),
			UNDNAME_NO_LEADING_UNDERSCORES|UNDNAME_NO_LEADING_UNDERSCORES|UNDNAME_NO_ALLOCATION_LANGUAGE|UNDNAME_NO_ACCESS_SPECIFIERS))
		{
			StripPrefix(undecBuffer, "virtual ");
			StripPrefix(undecBuffer, "class ");
			StripPrefix(undecBuffer, "struct ");
			appSprintf(buffer, size, "%s%s", undecBuffer, OffsetBuffer);
		}
		else
		{
			appSprintf(buffer, size, "%s%s", pSymbol->Name, OffsetBuffer);
		}
#else
		appSprintf(buffer, size, "%s%s", pSymbol->Name, OffsetBuffer);
#endif // EXTRA_UNDECORATE
	}
	else
	{
		appSprintf(buffer, size, "%08X", addr);
	}
	return true;
}
void StackTrace::GetCallStack(void* vcontext, bool includeArguments, 
                              char* symbol, int maxSymbolLen)
{
    PCONTEXT context = (PCONTEXT)vcontext;
    if (context == 0)
        return;

    InitSymbols();

    STACKFRAME64 stackFrame;
    memset(&stackFrame, 0, sizeof(stackFrame));

    InitStackFrameFromContext(context, stackFrame);
    stackFrame.AddrPC.Mode      = AddrModeFlat;
    stackFrame.AddrFrame.Mode   = AddrModeFlat;
    stackFrame.AddrStack.Mode   = AddrModeFlat;

    while (maxSymbolLen > 0 &&
        ::StackWalk64(IMAGE_FILE_MACHINE_I386,
            ::GetCurrentProcess(), ::GetCurrentThread(), &stackFrame,
            context, NULL, /*Internal_ReadProcessMemory,*/
            SymFunctionTableAccess64, SymGetModuleBase64, NULL) != FALSE &&
        stackFrame.AddrFrame.Offset != 0)
    {
        Address addr = reinterpret_cast<Address>(stackFrame.AddrPC.Offset);
        int charsAdded = GetSymbolInfo(addr, symbol, maxSymbolLen);
        maxSymbolLen -= charsAdded;
        symbol += charsAdded;
        if (maxSymbolLen > 0 && includeArguments)
        {
            charsAdded = _snprintf_s(symbol, maxSymbolLen, _TRUNCATE, 
                " (0x%08X 0x%08X 0x%08X 0x%08x)\n", stackFrame.Params[0],
                stackFrame.Params[1], stackFrame.Params[2], stackFrame.Params[3]);
            maxSymbolLen -= charsAdded;
            symbol += charsAdded;
        }
    }
}
void PE_Debug::DumpSymbolInfo(std::ostream& dumpBuffer, DWORD relativeAddress )
{
    // Variables to keep track of function symbols
    PIMAGE_SYMBOL currentSym = COFFSymbolTable ;
    PIMAGE_SYMBOL fnSymbol = NULL ;
    DWORD maxFnAddress = 0 ;

#ifdef DUMPRAM
    InitSymbols();
#endif

    // Variables to keep track of file symbols
    PIMAGE_SYMBOL fileSymbol = NULL ;
    PIMAGE_SYMBOL latestFileSymbol = NULL ;
    for ( int i = 0; i < COFFSymbolCount; i++ )	{

        // Look for .text section where relativeAddress belongs to.
        // Keep track of the filename the .text section belongs to.
        if ( currentSym->StorageClass == IMAGE_SYM_CLASS_FILE )	{
            latestFileSymbol = currentSym;
        }

        // Borland uses "CODE" instead of the standard ".text" entry
        // Microsoft uses sections that only _begin_ with .text
        const char* symName = GetSymbolName( currentSym ) ;

        if ( strnicmp( symName, ".text", 5 ) == 0 || strcmpi( symName, "CODE" ) == 0 )	{
            if ( currentSym->Value <= relativeAddress )	{
                PIMAGE_AUX_SYMBOL auxSym = (PIMAGE_AUX_SYMBOL)(currentSym + 1) ;
                if ( currentSym->Value + auxSym->Section.Length >= relativeAddress )	{
                    fileSymbol = latestFileSymbol ;
                }
            }
        }


        // Look for the function with biggest address <= relativeAddress
        BOOL isFunction = ISFCN( currentSym->Type ); // Type == 0x20, See WINNT.H
        if ( isFunction && ( currentSym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL || currentSym->StorageClass == IMAGE_SYM_CLASS_STATIC ) )	{

            if ( currentSym->Value <= relativeAddress && currentSym->Value > maxFnAddress )	{
                maxFnAddress = currentSym->Value ;
                fnSymbol = currentSym ;
            }
        }

#ifdef DUMPRAM
        if ( !isFunction && (currentSym->SectionNumber >= 0) )	{
            if ( (symName[0]=='_' && symName[1]!='$') || (symName[0]=='?') ) {

                char pretty_module[1024];

                if ( fileSymbol )	{
                    const char* auxSym = (const char*)(latestFileSymbol + 1) ;
                    char tmpFile[ VA_MAX_FILENAME_LEN ] ;
                    strcpy_s( tmpFile, auxSym ) ;
                    strcpy_s( pretty_module, tmpFile );
                    char *p = pretty_module+strlen(pretty_module)-1;
                    // Move p to point to first letter of EXE filename
                    while( (*p!='\\') && (*p!='/') && (*p!=':') )
                        p--;
                    p++;
                    if ( strlen(p) < 1 ) {
                        strcpy_s( pretty_module, "<unknown>" );
                    } else {
                        memmove( pretty_module, p, strlen(p)+1 );
                    }
                } else {
                    strcpy_s( pretty_module, "" );
                }

                Add_Symbol( currentSym->SectionNumber, currentSym->Value, symName, pretty_module );
            }
        }
#endif

        // Advance counters, skip aux symbols
        i += currentSym->NumberOfAuxSymbols ;
        currentSym += currentSym->NumberOfAuxSymbols ;
        currentSym++ ;
    }

#ifdef DUMPRAM
    DumpSymbols();
#endif

    // dump symbolic info if found
    if ( fileSymbol )	{
        const char* auxSym = (const char*)(fileSymbol + 1) ;

        if( strcmpi( latestFile, auxSym ) )	{
            strcpy_s( latestFile, auxSym ) ;
            //JAS      dumpBuffer.Printf( "  file: %s\r\n", auxSym ) ;
        }
    } else {
        latestFile[ 0 ] = 0 ;
        //JAS    dumpBuffer.Printf( "  file: unknown\r\n" ) ;
    }

    if ( fnSymbol )	{
        char tmp_name[1024];
        unmangle(tmp_name, GetSymbolName( fnSymbol ) );
        dumpBuffer << "    " << tmp_name << "()";
    } else {
        dumpBuffer << "    <unknown>";
    }
}
Exemple #10
0
int StackTrace::GetSymbolInfo(Address address, char* symbol, int maxSymbolLen)
{
    if (!InitSymbols())
        return 0;

    // Start with address.
    int charsAdded = 
        _snprintf_s(symbol, maxSymbolLen, _TRUNCATE, "%p ", address);
    symbol += charsAdded;
    maxSymbolLen -= charsAdded;
    if (maxSymbolLen < 0)
        return charsAdded;

    const DWORD64 address64 = (DWORD64)address;
    // Module name
    IMAGEHLP_MODULE64 moduleInfo;
    ZeroMemory(&moduleInfo, sizeof(moduleInfo));
    moduleInfo.SizeOfStruct = sizeof(moduleInfo);
    const HANDLE hCurrentProcess = GetCurrentProcess();
    if (SymGetModuleInfo64(hCurrentProcess, address64, &moduleInfo))
    {
        char moduleName[_MAX_PATH + 1];
        GetFileFromPath(moduleInfo.ImageName, moduleName, _MAX_PATH);
        const int moduleLen = (int)strlen(moduleName);
        strncpy_s(symbol, maxSymbolLen, moduleName, _TRUNCATE);
        symbol += moduleLen;
        charsAdded += moduleLen;
        maxSymbolLen -= moduleLen;
    }
    if (maxSymbolLen <= 0)
        return charsAdded;

    // Symbol name
    ULONG64 symbolBuffer[(sizeof(SYMBOL_INFO) + MAX_SYM_NAME*sizeof(TCHAR) +
            sizeof(ULONG64) - 1) / sizeof(ULONG64)] = { 0 };
    IMAGEHLP_SYMBOL64* symbolInfo = reinterpret_cast<IMAGEHLP_SYMBOL64*>(symbolBuffer);
    symbolInfo->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
    symbolInfo->MaxNameLength = MAX_SYM_NAME;
    DWORD64 disp(0);
    if (SymGetSymFromAddr64(hCurrentProcess, address64, &disp, symbolInfo))
    {
        const int symbolChars =
            _snprintf_s(symbol, maxSymbolLen, _TRUNCATE, " %s + 0x%X", symbolInfo->Name, disp);
        symbol += symbolChars;
        maxSymbolLen -= symbolChars;
        charsAdded += symbolChars;
    }
    if (maxSymbolLen <= 0)
        return charsAdded;

    // File + line
    DWORD displacementLine;
    IMAGEHLP_LINE64 lineInfo;
    ZeroMemory(&lineInfo, sizeof(lineInfo));
    lineInfo.SizeOfStruct = sizeof(lineInfo);
    if (SymGetLineFromAddr64(hCurrentProcess, address64, &displacementLine, &lineInfo))
    {
        char fileName[_MAX_PATH + 1];
        GetFileFromPath(lineInfo.FileName, fileName, _MAX_PATH);
        int fileLineChars(0);
        if (displacementLine > 0)
        {
            fileLineChars = _snprintf_s(symbol, maxSymbolLen, _TRUNCATE, 
                " %s(%d+%04d byte(s))", fileName, lineInfo.LineNumber, displacementLine);
        }
        else
        {
            fileLineChars = _snprintf_s(symbol, maxSymbolLen, _TRUNCATE,
                " %s(%d)", fileName, lineInfo.LineNumber);
        }
        symbol += fileLineChars;
        maxSymbolLen -= fileLineChars;
        charsAdded += fileLineChars;
    }
    return charsAdded;
}