7) Fix a random crash when reading the source lines information
8) Added ELF & DWARF .debug* types
9) Added ELF section types check and new error messages
-10) Project has switched to libdwarf 20191104 library 64bits for VS 2017
-11) Modified the call stack layout window and added source filename from the called source line
-12) Added a source tab in the main window for step into tracing
-13) Added the step over for source level tracing
-14) Project has switched to libdwarf 20200114 library 64bits for VS 2017
-15) Set text conversion to Qt/HTML format for the M68K tracing window
+10) Modified the call stack layout window and added source filename from the called source line
+11) Added a source tab in the main window for step into tracing
+12) Added the step over for source level tracing
+13) Project has switched to libdwarf 20200114 library 64bits for VS 2017
+14) Set text conversion to Qt/HTML format for the M68K tracing window
+15) Added a source code file date check when reading DWARF information
+-- Will avoid source code mismatching with the ELF executable
Release 4a (15th August 2019)
-----------------------------
\r
// Get source filename based on the memeory address\r
// return NULL if no source filename\r
-char *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error)\r
+char *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, DBGstatus *Status)\r
{\r
if ((DBGType & DBG_ELFDWARF))\r
{\r
- return DWARFManager_GetFullSourceFilenameFromAdr(Adr, Error);\r
+ return DWARFManager_GetFullSourceFilenameFromAdr(Adr, (DWARFstatus *)Status);\r
}\r
else\r
{\r
#define __DBGMANAGER_H__\r
\r
\r
+// Definition for the DWARF status of each source file\r
+typedef enum\r
+{\r
+ DBGSTATUS_OK = 0x0,\r
+ DBGSTATUS_OUTDATEDFILE = 0x1,\r
+ DBGSTATUS_NOFILE = 0x2,\r
+ DBGSTATUS_NOFILEINFO = 0x4,\r
+ DBGSTATUS_UNKNOWN = 0xff\r
+}DBGstatus;\r
+\r
// Language tag based in the DW_TAG_... list from the dwarf.h\r
typedef enum {\r
DBG_NO_LANG = 0x0,\r
extern size_t DBGManager_GetAdrFromSymbolName(char *SymbolName);\r
\r
// Source text files manager\r
-extern char *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error);\r
+extern char *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, DBGstatus *Status);\r
extern char *DBGManager_GetNumFullSourceFilename(size_t Index);\r
extern char *DBGManager_GetNumSourceFilename(size_t Index);\r
\r
// JPM Oct./2018 Improve the DWARF parsing information, and the source file text reading; support the used source lines from DWARF structure, and the search paths for the files\r
// JPM Aug./2019 Added new functions to handle DWARF information, full filename fix\r
// JPM Mar./2020 Fix a random crash when reading the source lines information\r
+// JPM Aug./2020 Added a source code file date check when reading DWARF information\r
//\r
\r
// To Do\r
#include <stdio.h>\r
#include <stdint.h>\r
#include <string.h>\r
-#include <libdwarf.h>\r
-#include <dwarf.h>\r
+#include <time.h>\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+#include "libdwarf.h"\r
+#include "dwarf.h"\r
#include "LEB128.h"\r
+#include "DWARFManager.h"\r
\r
\r
// Definitions for debugging\r
size_t Tag;\r
size_t Language; // Language (C, etc.) used by the source code\r
size_t LowPC, HighPC; // Memory range for the code\r
- char *PtrProducer; // Pointer to the "Producer" text information (mostly compiler and compilation options used)\r
+ char *PtrProducer; // "Producer" text information (mostly compiler and compilation options used)\r
char *PtrSourceFilename; // Source file name\r
char *PtrSourceFileDirectory; // Directory of the source file\r
char *PtrFullFilename; // Pointer to full namefile (directory & filename)\r
CUStruct_LineSrc *PtrUsedLinesSrc; // Pointer to the used source lines list structure\r
char **PtrUsedLinesLoadSrc; // Pointer lists to each used source line referenced by the CUStruct_LineSrc structure\r
size_t *PtrUsedNumLines; // List of the number lines used\r
+ struct _stat _statbuf; // File information\r
+ DWARFstatus Status; // File status\r
}S_CUStruct;\r
\r
\r
CUStruct *PtrCU;\r
char **ListSearchPaths;\r
size_t NbSearchPaths;\r
+struct _stat FileElfExeInfo;\r
\r
\r
//\r
\r
\r
// Dwarf manager Elf init\r
-int DWARFManager_ElfInit(Elf *ElfPtr)\r
+int DWARFManager_ElfInit(Elf *ElfPtr, struct _stat FileElfInfo)\r
{\r
if ((LibDwarf = dwarf_elf_init(ElfPtr, DW_DLC_READ, (Dwarf_Handler)DWARFManager_ErrorHandler, errarg, &dbg, &error)) == DW_DLV_OK)\r
{\r
+ FileElfExeInfo = FileElfInfo;\r
DWARFManager_InitDMI();\r
}\r
\r
strcpy((Ptr1 + 1), (Ptr + 4));\r
}\r
\r
- // Open the source file as a binary file\r
- if (!fopen_s(&SrcFile, PtrCU[NbCU].PtrFullFilename, "rb"))\r
+ // Get the source file information\r
+ if (!_stat(PtrCU[NbCU].PtrFullFilename, &PtrCU[NbCU]._statbuf))\r
{\r
- if (!fseek(SrcFile, 0, SEEK_END))\r
+ // check the time stamp with the executable\r
+ if (PtrCU[NbCU]._statbuf.st_mtime <= FileElfExeInfo.st_mtime)\r
{\r
- if ((PtrCU[NbCU].SizeLoadSrc = ftell(SrcFile)) > 0)\r
+ // Open the source file as a binary file\r
+ if (!fopen_s(&SrcFile, PtrCU[NbCU].PtrFullFilename, "rb"))\r
{\r
- if (!fseek(SrcFile, 0, SEEK_SET))\r
+ if (!fseek(SrcFile, 0, SEEK_END))\r
{\r
- if (PtrCU[NbCU].PtrLoadSrc = Ptr = Ptr1 = (char *)calloc(1, (PtrCU[NbCU].SizeLoadSrc + 2)))\r
+ if ((PtrCU[NbCU].SizeLoadSrc = ftell(SrcFile)) > 0)\r
{\r
- // Read whole file\r
- if (fread_s(PtrCU[NbCU].PtrLoadSrc, PtrCU[NbCU].SizeLoadSrc, PtrCU[NbCU].SizeLoadSrc, 1, SrcFile) != 1)\r
- {\r
- free(PtrCU[NbCU].PtrLoadSrc);\r
- PtrCU[NbCU].PtrLoadSrc = NULL;\r
- PtrCU[NbCU].SizeLoadSrc = 0;\r
- }\r
- else\r
+ if (!fseek(SrcFile, 0, SEEK_SET))\r
{\r
- // Eliminate all carriage return code '\r' (oxd)\r
- do\r
+ if (PtrCU[NbCU].PtrLoadSrc = Ptr = Ptr1 = (char *)calloc(1, (PtrCU[NbCU].SizeLoadSrc + 2)))\r
{\r
- if ((*Ptr = *Ptr1) != '\r')\r
+ // Read whole file\r
+ if (fread_s(PtrCU[NbCU].PtrLoadSrc, PtrCU[NbCU].SizeLoadSrc, PtrCU[NbCU].SizeLoadSrc, 1, SrcFile) != 1)\r
{\r
- Ptr++;\r
+ free(PtrCU[NbCU].PtrLoadSrc);\r
+ PtrCU[NbCU].PtrLoadSrc = NULL;\r
+ PtrCU[NbCU].SizeLoadSrc = 0;\r
}\r
- }\r
- while (*Ptr1++);\r
+ else\r
+ {\r
+ // Eliminate all carriage return code '\r' (oxd)\r
+ do\r
+ {\r
+ if ((*Ptr = *Ptr1) != '\r')\r
+ {\r
+ Ptr++;\r
+ }\r
+ } while (*Ptr1++);\r
\r
- // Get back the new text file size\r
- PtrCU[NbCU].SizeLoadSrc = strlen(Ptr = PtrCU[NbCU].PtrLoadSrc);\r
+ // Get back the new text file size\r
+ PtrCU[NbCU].SizeLoadSrc = strlen(Ptr = PtrCU[NbCU].PtrLoadSrc);\r
\r
- // Make sure the text file finish with a new line code '\n' (0xa)\r
- if (PtrCU[NbCU].PtrLoadSrc[PtrCU[NbCU].SizeLoadSrc - 1] != '\n')\r
- {\r
- PtrCU[NbCU].PtrLoadSrc[PtrCU[NbCU].SizeLoadSrc++] = '\n';\r
- PtrCU[NbCU].PtrLoadSrc[PtrCU[NbCU].SizeLoadSrc] = 0;\r
- }\r
+ // Make sure the text file finish with a new line code '\n' (0xa)\r
+ if (PtrCU[NbCU].PtrLoadSrc[PtrCU[NbCU].SizeLoadSrc - 1] != '\n')\r
+ {\r
+ PtrCU[NbCU].PtrLoadSrc[PtrCU[NbCU].SizeLoadSrc++] = '\n';\r
+ PtrCU[NbCU].PtrLoadSrc[PtrCU[NbCU].SizeLoadSrc] = 0;\r
+ }\r
\r
- // Reallocate text file\r
- if (PtrCU[NbCU].PtrLoadSrc = Ptr = (char *)realloc(PtrCU[NbCU].PtrLoadSrc, (PtrCU[NbCU].SizeLoadSrc + 1)))\r
- {\r
- // Count line numbers, based on the new line code '\n' (0xa), and finish each line with 0\r
- do\r
- {\r
- if (*Ptr == '\n')\r
+ // Reallocate text file\r
+ if (PtrCU[NbCU].PtrLoadSrc = Ptr = (char *)realloc(PtrCU[NbCU].PtrLoadSrc, (PtrCU[NbCU].SizeLoadSrc + 1)))\r
{\r
- PtrCU[NbCU].NbLinesLoadSrc++;\r
- *Ptr = 0;\r
+ // Count line numbers, based on the new line code '\n' (0xa), and finish each line with 0\r
+ do\r
+ {\r
+ if (*Ptr == '\n')\r
+ {\r
+ PtrCU[NbCU].NbLinesLoadSrc++;\r
+ *Ptr = 0;\r
+ }\r
+ } while (*++Ptr);\r
}\r
- } while (*++Ptr);\r
+ }\r
}\r
}\r
}\r
}\r
+\r
+ fclose(SrcFile);\r
}\r
+ else\r
+ {\r
+ // Source file doesn't exist\r
+ PtrCU[NbCU].Status = DWARFSTATUS_NOFILE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // Source file is outdated\r
+ PtrCU[NbCU].Status = DWARFSTATUS_OUTDATEDFILE;\r
}\r
- fclose(SrcFile);\r
+ }\r
+ else\r
+ {\r
+ // Source file doesn't have information\r
+ PtrCU[NbCU].Status = DWARFSTATUS_NOFILEINFO;\r
}\r
break;\r
\r
}\r
\r
// Get the source lines table located in the CU\r
- if (dwarf_srclines(return_sib, &linebuf, &cnt, &error) == DW_DLV_OK)\r
+ if ((dwarf_srclines(return_sib, &linebuf, &cnt, &error) == DW_DLV_OK) && (PtrCU[NbCU].Status == DWARFSTATUS_OK))\r
{\r
if (cnt)\r
{\r
// Get source line number and associated block of address\r
for (Dwarf_Signed i = 0; i < cnt; ++i)\r
{\r
- if ((PtrCU[NbCU].PtrUsedLinesSrc[i].StartPC >= return_lowpc) && (PtrCU[NbCU].PtrUsedLinesSrc[i].StartPC <= return_highpc))\r
+ // Check the presence of the line in the memory frame\r
+ if (PtrCU[NbCU].PtrUsedLinesSrc && (PtrCU[NbCU].PtrUsedLinesSrc[i].StartPC >= return_lowpc) && (PtrCU[NbCU].PtrUsedLinesSrc[i].StartPC <= return_highpc))\r
{\r
PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc = (DMIStruct_LineSrc *)realloc(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc, (PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc + 1) * sizeof(DMIStruct_LineSrc));\r
memset((void *)(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc), 0, sizeof(DMIStruct_LineSrc));\r
\r
// Get complete source filename based from address\r
// Return NULL if no source filename exists\r
-// Return the existence status (true or false) in Error if pointer not NULL\r
-char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error)\r
+// Return the existence status in Status if pointer not NULL\r
+char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, DWARFstatus *Status)\r
{\r
for (size_t i = 0; i < NbCU; i++)\r
{\r
if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
{\r
- if (Error)\r
+ if (Status)\r
{\r
- *Error = PtrCU[i].PtrLoadSrc ? true : false;\r
+ *Status = PtrCU[i].Status;\r
}\r
\r
return PtrCU[i].PtrFullFilename;\r
#define __DWARFMANAGER_H__\r
\r
\r
+// Definition for the DWARF status of each source file\r
+typedef enum\r
+{\r
+ DWARFSTATUS_OK = 0x0,\r
+ DWARFSTATUS_OUTDATEDFILE = 0x1,\r
+ DWARFSTATUS_NOFILE = 0x2,\r
+ DWARFSTATUS_NOFILEINFO = 0x4,\r
+ DWARFSTATUS_UNKNOWN = 0xff\r
+}DWARFstatus;\r
+\r
// Internal manager\r
extern bool DWARFManager_Reset(void);\r
extern bool DWARFManager_Close(void);\r
extern void DWARFManager_Init(void);\r
-extern int DWARFManager_ElfInit(Elf *ElfPtr);\r
+extern int DWARFManager_ElfInit(Elf *ElfPtr, struct _stat FileElfInfo);\r
extern void DWARFManager_Set(size_t NbPathsInList, char **PtrListPaths);\r
extern size_t DWARFManager_GetNbSources(void);\r
\r
extern size_t DWARFManager_GetSrcLanguageFromIndex(size_t Index);\r
\r
// Source text files manager\r
-extern char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error);\r
+extern char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, DWARFstatus *Status);\r
extern char *DWARFManager_GetNumFullSourceFilename(size_t Index);\r
extern char *DWARFManager_GetNumSourceFilename(size_t Index);\r
\r
#include <stdlib.h>
#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
#include "libelf/libelf.h"
#include "libelf/gelf.h"
#include "libdwarf.h"
// ELF manager Dwarf Initialisation
-bool ELFManager_DwarfInit(Elf *PtrElfMem)
+bool ELFManager_DwarfInit(Elf *PtrElfMem, struct _stat FileElfInfo)
{
- return (ElfDwarf = (DWARFManager_ElfInit(PtrElfMem) == DW_DLV_OK) ? true : false);
+ return (ElfDwarf = (DWARFManager_ElfInit(PtrElfMem, FileElfInfo) == DW_DLV_OK) ? true : false);
}
// Internal manager
extern void ELFManager_Init(void);
-extern bool ELFManager_DwarfInit(Elf *PtrElfMem);
+extern bool ELFManager_DwarfInit(Elf *PtrElfMem, struct _stat FileElfInfo);
extern Elf *ELFManager_MemOpen(char *PtrELFExe, size_t Size);
extern int ELFManager_MemEnd(void);
extern void ELFManager_Reset(void);
{
// Set information based on address
Brk.Name = DBGManager_GetSymbolNameFromAdr(adr);
- Brk.Filename = DBGManager_GetFullSourceFilenameFromAdr(adr, &ok);
+ Brk.Filename = DBGManager_GetFullSourceFilenameFromAdr(adr, NULL);
Brk.NumLine = DBGManager_GetNumLineFromAdr(adr, DBG_TAG_subprogram);
Brk.LineSrc = DBGManager_GetLineSrcFromAdrNumLine(adr, Brk.NumLine);
size_t m68kPC = m68k_get_reg(NULL, M68K_REG_PC);
int index = 0;
size_t i;
- bool Error;
+ DBGstatus Status;
char *Filename;
// Check valid PC
if (m68kPC && NbSourcesInfos)
{
// Get source filename pointed by PC address
- Filename = DBGManager_GetFullSourceFilenameFromAdr(m68kPC, &Error);
- if (Error && Filename)
+ Filename = DBGManager_GetFullSourceFilenameFromAdr(m68kPC, &Status);
+ if (!Status && Filename)
{
// Look for a new tab
for (i = 0; i < NbSourcesInfos; i++, !index)
// Source file doesn't exist
if (indexErrorTab == -1)
{
- indexErrorTab = sourcestabWidget->addTab(sourceErrorTab = new(SourceCWindow), tr("Source file not found"));
+ indexErrorTab = sourcestabWidget->addTab(sourceErrorTab = new(SourceCWindow), tr("Source file not available"));
//sourceErrorTab->hide();
}
sourcestabWidget->setCurrentIndex(indexErrorTab);
{
char msg[1024];
size_t Error = CS_NOERROR;
- bool FilenameError;
+ DBGstatus FilenameStatus;
unsigned int a6, Sa6, ret;
char *Name;
size_t NumError = 0;
sprintf(msg, "0x%06X", ret);
model->setItem(NbRaw, 2, new QStandardItem(QString("%1").arg(msg)));
// display the source filename from called source line
- model->setItem(NbRaw++, 3, new QStandardItem(QString("%1").arg(((Name = DBGManager_GetFullSourceFilenameFromAdr(ret, &FilenameError)) && FilenameError) ? Name : "(N/A)")));
+ model->setItem(NbRaw++, 3, new QStandardItem(QString("%1").arg(((Name = DBGManager_GetFullSourceFilenameFromAdr(ret, &FilenameStatus)) && !FilenameStatus) ? Name : "(N/A)")));
#endif
}
else
// JPM 06/27/2016 Created this file\r
// JPM 12/04/2016 Suport ELF debug information\r
// JPM Replacing the ELF support by the debugger information manager calls\r
-// JPM Aug./2020 Display only the code related to the traced function, added different layouts, Qt/HTML text format support\r
+// JPM Aug./2020 Display only the code related to the traced function, added different layouts & a status bar, Qt/HTML text format support\r
//\r
\r
// STILL TO DO:\r
// \r
m68KDasmWindow::m68KDasmWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog),\r
layout(new QVBoxLayout),\r
+#if MD_LAYOUTFILE == 1\r
+statusbar(new QStatusBar),\r
+#endif\r
#ifdef MD_LAYOUTTEXTS\r
text(new QTextBrowser),\r
#endif\r
layout->addWidget(text);\r
#endif\r
\r
+ // Status bar\r
+#if MD_LAYOUTFILE == 1\r
+ layout->addWidget(statusbar);\r
+ setLayout(layout);\r
+#endif\r
+\r
// Set layout\r
setLayout(layout);\r
}\r
size_t m68KPCNbrDisasmLines = 0;\r
char *Symbol = NULL, *LineSrc, *CurrentLineSrc = NULL;\r
bool m68kPCShow = false;\r
- bool constant, adr, equal, Error;\r
+ bool constant, adr, equal;\r
+ DBGstatus Status;\r
size_t j, i;\r
size_t nbr = vjs.nbrdisasmlines;\r
char *PtrFullSource, *CurrentPtrFullSource = (char *)calloc(1, 1);\r
adr = constant = equal = false;\r
\r
// Display source filename based on the program address\r
- if (vjs.displayFullSourceFilename && (PtrFullSource = DBGManager_GetFullSourceFilenameFromAdr(oldpc, &Error)) && strcmp(CurrentPtrFullSource, PtrFullSource))\r
+ if (vjs.displayFullSourceFilename && (PtrFullSource = DBGManager_GetFullSourceFilenameFromAdr(oldpc, &Status)) && strcmp(CurrentPtrFullSource, PtrFullSource))\r
{\r
#if defined(MD_LAYOUTFILE)\r
if (i)\r
CurrentPtrFullSource = (char *)realloc(CurrentPtrFullSource, strlen(PtrFullSource) + 1);\r
strcpy(CurrentPtrFullSource, PtrFullSource);\r
#if defined(MD_LAYOUTFILE)\r
- if (!Error)\r
+ if (Status)\r
{\r
- // Referenced filename does exist\r
+ // Referenced filename doesn't exist\r
sprintf(string, "<font color='#ff0000'><b>%s</b></font><br>", PtrFullSource);\r
+#if MD_LAYOUTFILE == 1\r
+ // Display status bar\r
+ if ((Status & DBGSTATUS_OUTDATEDFILE))\r
+ {\r
+ statusbar->setStyleSheet("background-color: lightyellow; font: bold");\r
+ statusbar->showMessage(QString("Outdated source file"));\r
+ }\r
+ else\r
+ {\r
+ statusbar->setStyleSheet("background-color: tomato; font: bold");\r
+ statusbar->showMessage(QString("Unavailable source file"));\r
+ }\r
+#endif\r
}\r
else\r
{\r
- // Referenced filename doesn't exist\r
+ // Referenced filename does exist\r
sprintf(string, "<font color='#00ff00'><b>%s</b></font><br>", PtrFullSource);\r
+#if MD_LAYOUTFILE == 1\r
+ // Display status bar\r
+ statusbar->setStyleSheet("background-color: transparent; font: bold");\r
+ statusbar->showMessage(QString(""));\r
+#endif\r
}\r
nbr++;\r
s += QString(string);\r
else\r
{\r
// Display line number based on the program address\r
- if ((NumLine = DBGManager_GetNumLineFromAdr(oldpc, DBG_NO_TAG)) && ((signed)NumLine > (signed)CurrentNumLine))\r
+ if ((NumLine = DBGManager_GetNumLineFromAdr(oldpc, DBG_NO_TAG)) && ((signed)NumLine > (signed)CurrentNumLine) && !Status)\r
{\r
#if MD_LAYOUTFILE != 1\r
if ((signed)CurrentNumLine < 0)\r
// Who When What\r
// --- ---------- -------------------------------------------------------------\r
// JPM 06/27/2016 Created this file\r
-// JPM Aug./2020 Added different layouts\r
+// JPM Aug./2020 Added different layouts, and a status bar\r
//\r
\r
#ifndef __M68KDASMWIN_H__\r
\r
private:\r
QVBoxLayout *layout;\r
+#if MD_LAYOUTFILE == 1\r
+ QStatusBar *statusbar;\r
+#endif\r
#ifdef MD_LAYOUTTEXTS\r
QTextBrowser *text;\r
#endif\r
// JPM 07/15/2016 DWARF format support\r
// JPM 04/06/2019 Added ELF sections check\r
// JPM 03/12/2020 Added ELF section types check and new error messages\r
+// JPM Aug./2020 ELF executable file information\r
//\r
\r
#include "file.h"\r
#endif // _MSC_VER\r
#include <stdarg.h>\r
#include <string.h>\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
#include "crc32.h"\r
#include "filedb.h"\r
#include "eeprom.h"\r
int DBGType = DBG_NO_TYPE;\r
bool error;\r
int err;\r
+ struct _stat _statbuf;\r
\r
jaguarROMSize = JaguarLoadROM(buffer, path);\r
\r
\r
if (PtrELFExe != NULL)\r
{\r
+ // check the ELF version\r
if ((elf_version(EV_CURRENT) != EV_NONE) && (ElfMem = ELFManager_MemOpen(PtrELFExe, jaguarROMSize)))\r
{\r
- if (ELFManager_DwarfInit(ElfMem))\r
+ // get the file information\r
+ _stat(path, &_statbuf);\r
+\r
+ if (ELFManager_DwarfInit(ElfMem, _statbuf))\r
{\r
DBGType |= DBG_ELFDWARF;\r
}\r