From 41d6f5f7b28e5424b8cbc4244486dd294009faab Mon Sep 17 00:00:00 2001 From: Jean-Paul Mari Date: Wed, 18 Oct 2017 02:25:53 -0400 Subject: [PATCH] Fixed a crash when DWARF report a source line number exceeding the number of lines present in the source file --- VS2015/virtualjaguar.vcxproj.user | 2 +- docs/vj_ReleaseNotes.txt | 4 +- src/debugger/DBGManager.cpp | 8 +- src/debugger/DWARFManager.cpp | 828 +++++++++++++++--------------- 4 files changed, 432 insertions(+), 410 deletions(-) diff --git a/VS2015/virtualjaguar.vcxproj.user b/VS2015/virtualjaguar.vcxproj.user index e9f0ef6..a87c88b 100644 --- a/VS2015/virtualjaguar.vcxproj.user +++ b/VS2015/virtualjaguar.vcxproj.user @@ -38,7 +38,7 @@ C:\Qt\Qt5.5.1\msvc2015_64 $(OutDir) WindowsLocalDebugger - C:\Projects\GLib-M68K\Lib-Test-M68K\Debug\LibTestM68K_Debug.elf --debugger + C:\Projects\quake2\JagCake\Debug\JagCake_Debug.elf --debugger PATH=$(QTDIR)\bin%3bC:\Qt\qt5-5.5.1-vs2015\qt5-x86-shared-debug\bin%3b$(PATH) diff --git a/docs/vj_ReleaseNotes.txt b/docs/vj_ReleaseNotes.txt index 533df09..0eaa385 100644 --- a/docs/vj_ReleaseNotes.txt +++ b/docs/vj_ReleaseNotes.txt @@ -17,7 +17,9 @@ Release 3 (WiP) 11) Fixed the SP (Stack) window UI potential missing data 12) Create a directory for EEPROMs (based on the EEPROMs setting) if it doesn't already exist 13) Keep the scrollbar position in accordance of the M68K PC pointer --- User will be able to see the source without the need to move down/up the scrollbar +-- UI displays the source without the need to move down/up the scrollbar +14) Fixed a crash when DWARF report a source line number exceeding the number of lines present in the source file +-- This may come from the linker vlink Release 2 (3rd September 2017) ------------------------------ diff --git a/src/debugger/DBGManager.cpp b/src/debugger/DBGManager.cpp index d4df274..044bd03 100644 --- a/src/debugger/DBGManager.cpp +++ b/src/debugger/DBGManager.cpp @@ -418,10 +418,10 @@ char *DBGManager_GetSymbolnameFromAdr(size_t Adr) { Symbolname = NULL; } -#ifdef _MSC_VER -#pragma message("Warning: !!! Need to set the DBG_HWLABEL in DBGType instead to use the setting value !!!") -#else - #warning "!!! Need to set the DBG_HWLABEL in DBGType instead to use the setting value !!!" +#ifdef _MSC_VER +#pragma message("Warning: !!! Need to set the DBG_HWLABEL in DBGType instead to use the setting value !!!") +#else + #warning "!!! Need to set the DBG_HWLABEL in DBGType instead to use the setting value !!!" #endif // _MSC_VER if (Symbolname == NULL) diff --git a/src/debugger/DWARFManager.cpp b/src/debugger/DWARFManager.cpp index 0a3012c..dfc2ffc 100644 --- a/src/debugger/DWARFManager.cpp +++ b/src/debugger/DWARFManager.cpp @@ -11,12 +11,16 @@ // JPM 12/03/2016 DWARF format support -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include + + +// +//#define DEBUG_NumCU 0x42 // CU number to debug or undefine it // Source line internal structure @@ -241,539 +245,548 @@ void DWARFManager_InitDMI(void) PtrCU = (CUStruct *)Ptr; memset(PtrCU + NbCU, 0, sizeof(CUStruct)); - // Get 1st Die from the Compilation Unit - if (dwarf_siblingof(dbg, NULL, &return_sib, &error) == DW_DLV_OK) + // Debug specific CU +#ifdef DEBUG_NumCU + if (NbCU == DEBUG_NumCU) +#endif { - // Get Die's Tag - if ((dwarf_tag(return_sib, &return_tagval, &error) == DW_DLV_OK)) + // Get 1st Die from the Compilation Unit + if (dwarf_siblingof(dbg, NULL, &return_sib, &error) == DW_DLV_OK) { - PtrCU[NbCU].Tag = return_tagval; - - // Die type detection - switch (return_tagval) + // Get Die's Tag + if ((dwarf_tag(return_sib, &return_tagval, &error) == DW_DLV_OK)) { - case DW_TAG_compile_unit: - if (dwarf_attrlist(return_sib, &atlist, &atcnt, &error) == DW_DLV_OK) + PtrCU[NbCU].Tag = return_tagval; + + // Die type detection + switch (return_tagval) { - for (Dwarf_Signed i = 0; i < atcnt; ++i) + case DW_TAG_compile_unit: + if (dwarf_attrlist(return_sib, &atlist, &atcnt, &error) == DW_DLV_OK) { - if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK) + for (Dwarf_Signed i = 0; i < atcnt; ++i) { - switch (return_attr) + if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK) { - case DW_AT_low_pc: - if (dwarf_lowpc(return_sib, &return_lowpc, &error) == DW_DLV_OK) + switch (return_attr) { - PtrCU[NbCU].LowPC = return_lowpc; - } - break; + case DW_AT_low_pc: + if (dwarf_lowpc(return_sib, &return_lowpc, &error) == DW_DLV_OK) + { + PtrCU[NbCU].LowPC = return_lowpc; + } + break; - case DW_AT_high_pc: - if (dwarf_highpc(return_sib, &return_highpc, &error) == DW_DLV_OK) - { - PtrCU[NbCU].HighPC = return_highpc; - } - break; + case DW_AT_high_pc: + if (dwarf_highpc(return_sib, &return_highpc, &error) == DW_DLV_OK) + { + PtrCU[NbCU].HighPC = return_highpc; + } + break; - case DW_AT_producer: - if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK) - { - PtrCU[NbCU].PtrProducer = (char *)calloc(strlen(return_string) + 1, 1); - strcpy(PtrCU[NbCU].PtrProducer, return_string); - dwarf_dealloc(dbg, return_string, DW_DLA_STRING); - } - break; + case DW_AT_producer: + if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrProducer = (char *)calloc(strlen(return_string) + 1, 1); + strcpy(PtrCU[NbCU].PtrProducer, return_string); + dwarf_dealloc(dbg, return_string, DW_DLA_STRING); + } + break; - case DW_AT_name: - if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK) - { - SourceFilename = (char *)realloc(SourceFilename, strlen(return_string) + 1); - strcpy(SourceFilename, return_string); - dwarf_dealloc(dbg, return_string, DW_DLA_STRING); - } - break; + case DW_AT_name: + if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK) + { + SourceFilename = (char *)realloc(SourceFilename, strlen(return_string) + 1); + strcpy(SourceFilename, return_string); + dwarf_dealloc(dbg, return_string, DW_DLA_STRING); + } + break; - case DW_AT_comp_dir: - if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK) - { - SourceFileDirectory = (char *)realloc(SourceFileDirectory, strlen(return_string) + 1); - strcpy(SourceFileDirectory, return_string); - dwarf_dealloc(dbg, return_string, DW_DLA_STRING); - } - break; + case DW_AT_comp_dir: + if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK) + { + SourceFileDirectory = (char *)realloc(SourceFileDirectory, strlen(return_string) + 1); + strcpy(SourceFileDirectory, return_string); + dwarf_dealloc(dbg, return_string, DW_DLA_STRING); + } + break; - default: - break; + default: + break; + } } + dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR); } - dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR); + dwarf_dealloc(dbg, atlist, DW_DLA_LIST); } - dwarf_dealloc(dbg, atlist, DW_DLA_LIST); - } - Ptr = SourceFullFilename = (char *)realloc(SourceFullFilename, strlen(SourceFilename) + strlen(SourceFileDirectory) + 2); - sprintf(SourceFullFilename, "%s\\%s", SourceFileDirectory, SourceFilename); - while (*Ptr) - { - if (*Ptr == '/') + Ptr = SourceFullFilename = (char *)realloc(SourceFullFilename, strlen(SourceFilename) + strlen(SourceFileDirectory) + 2); + sprintf(SourceFullFilename, "%s\\%s", SourceFileDirectory, SourceFilename); + while (*Ptr) { - *Ptr = '\\'; + if (*Ptr == '/') + { + *Ptr = '\\'; + } + Ptr++; } - Ptr++; - } - PtrCU[NbCU].PtrFullFilename = (char *)calloc(strlen(SourceFullFilename) + 1, 1); - strcpy((char *)PtrCU[NbCU].PtrFullFilename, SourceFullFilename); + PtrCU[NbCU].PtrFullFilename = (char *)calloc(strlen(SourceFullFilename) + 1, 1); + strcpy((char *)PtrCU[NbCU].PtrFullFilename, SourceFullFilename); #ifndef __CYGWIN__ - if (!fopen_s(&SrcFile, SourceFullFilename, "rt")) + if (!fopen_s(&SrcFile, SourceFullFilename, "rt")) #else - if (!(SrcFile = fopen(SourceFullFilename, "rt"))) + if (!(SrcFile = fopen(SourceFullFilename, "rt"))) #endif - { - if (!fseek(SrcFile, 0, SEEK_END)) { - if ((PtrCU[NbCU].SizeLoadSrc = ftell(SrcFile)) > 0) + if (!fseek(SrcFile, 0, SEEK_END)) { - if (PtrCU[NbCU].PtrLoadSrc = Ptr = (char *)calloc((PtrCU[NbCU].SizeLoadSrc + 1), 1)) + if ((PtrCU[NbCU].SizeLoadSrc = ftell(SrcFile)) > 0) { - rewind(SrcFile); - if (PtrCU[NbCU].SizeLoadSrc < fread(Ptr, 1, PtrCU[NbCU].SizeLoadSrc, SrcFile)) + if (PtrCU[NbCU].PtrLoadSrc = Ptr = (char *)calloc((PtrCU[NbCU].SizeLoadSrc + 1), 1)) { - free(PtrCU[NbCU].PtrLoadSrc); - PtrCU[NbCU].PtrLoadSrc = NULL; - PtrCU[NbCU].SizeLoadSrc = 0; - } - else - { - do + rewind(SrcFile); + if (PtrCU[NbCU].SizeLoadSrc < fread(Ptr, 1, PtrCU[NbCU].SizeLoadSrc, SrcFile)) + { + free(PtrCU[NbCU].PtrLoadSrc); + PtrCU[NbCU].PtrLoadSrc = NULL; + PtrCU[NbCU].SizeLoadSrc = 0; + } + else { - if (*Ptr == 0xa) + do { - PtrCU[NbCU].NbLinesLoadSrc++; - *Ptr = 0; - } - } while (*++Ptr); + if (*Ptr == 0xa) + { + PtrCU[NbCU].NbLinesLoadSrc++; + *Ptr = 0; + } + } while (*++Ptr); + } } } } + fclose(SrcFile); } - fclose(SrcFile); - } - break; + break; - default: - break; + default: + break; + } } - } - // Get the source lines table located in the Compilation Unit - if (dwarf_srclines(return_sib, &linebuf, &cnt, &error) == DW_DLV_OK) - { - } + // Get the source lines table located in the Compilation Unit + if (dwarf_srclines(return_sib, &linebuf, &cnt, &error) == DW_DLV_OK) + { + } - if (dwarf_child(return_sib, &return_die, &error) == DW_DLV_OK) - { - do + if (dwarf_child(return_sib, &return_die, &error) == DW_DLV_OK) { - return_sib = return_die; - if ((dwarf_tag(return_die, &return_tagval, &error) == DW_DLV_OK)) + do { - switch (return_tagval) + return_sib = return_die; + if ((dwarf_tag(return_die, &return_tagval, &error) == DW_DLV_OK)) { - case DW_TAG_lexical_block: - break; - - case DW_TAG_variable: - if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK) + switch (return_tagval) { - PtrCU[NbCU].PtrVariables = (VariablesStruct *)realloc(PtrCU[NbCU].PtrVariables, ((PtrCU[NbCU].NbVariables + 1) * sizeof(VariablesStruct))); - memset(PtrCU[NbCU].PtrVariables + PtrCU[NbCU].NbVariables, 0, sizeof(VariablesStruct)); + case DW_TAG_lexical_block: + break; - for (Dwarf_Signed i = 0; i < atcnt; ++i) + case DW_TAG_variable: + if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK) { - if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK) + PtrCU[NbCU].PtrVariables = (VariablesStruct *)realloc(PtrCU[NbCU].PtrVariables, ((PtrCU[NbCU].NbVariables + 1) * sizeof(VariablesStruct))); + memset(PtrCU[NbCU].PtrVariables + PtrCU[NbCU].NbVariables, 0, sizeof(VariablesStruct)); + + for (Dwarf_Signed i = 0; i < atcnt; ++i) { - if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK) + if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK) { - switch (return_attr) + if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK) { - case DW_AT_location: - if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK) + switch (return_attr) { - if (return_block->bl_len == 5) + case DW_AT_location: + if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK) { - PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].Addr = (*((unsigned char *)(return_block->bl_data) + 1) << 24) + (*((unsigned char *)(return_block->bl_data) + 2) << 16) + (*((unsigned char *)(return_block->bl_data) + 3) << 8) + (*((unsigned char *)(return_block->bl_data) + 4)); + if (return_block->bl_len == 5) + { + PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].Addr = (*((unsigned char *)(return_block->bl_data) + 1) << 24) + (*((unsigned char *)(return_block->bl_data) + 2) << 16) + (*((unsigned char *)(return_block->bl_data) + 3) << 8) + (*((unsigned char *)(return_block->bl_data) + 4)); + } + dwarf_dealloc(dbg, return_block, DW_DLA_BLOCK); } - dwarf_dealloc(dbg, return_block, DW_DLA_BLOCK); - } - break; + break; - case DW_AT_type: - if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK) - { - PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].TypeOffset = return_offset; - } - break; + case DW_AT_type: + if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].TypeOffset = return_offset; + } + break; - case DW_AT_name: - if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK) - { - PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName = (char *)calloc(strlen(return_string) + 1, 1); - strcpy(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName, return_string); - dwarf_dealloc(dbg, return_string, DW_DLA_STRING); - } - break; + case DW_AT_name: + if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName = (char *)calloc(strlen(return_string) + 1, 1); + strcpy(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName, return_string); + dwarf_dealloc(dbg, return_string, DW_DLA_STRING); + } + break; - default: - break; + default: + break; + } } } - } - - dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR); - } - - PtrCU[NbCU].NbVariables++; - dwarf_dealloc(dbg, atlist, DW_DLA_LIST); - } - break; + dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR); + } - case DW_TAG_base_type: - case DW_TAG_typedef: - case DW_TAG_structure_type: - case DW_TAG_pointer_type: - case DW_TAG_const_type: - case DW_TAG_array_type: - case DW_TAG_subrange_type: - case DW_TAG_subroutine_type: - if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK) - { - PtrCU[NbCU].PtrTypes = (BaseTypeStruct *)realloc(PtrCU[NbCU].PtrTypes, ((PtrCU[NbCU].NbTypes + 1) * sizeof(BaseTypeStruct))); - memset(PtrCU[NbCU].PtrTypes + PtrCU[NbCU].NbTypes, 0, sizeof(BaseTypeStruct)); - PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Tag = return_tagval; + PtrCU[NbCU].NbVariables++; - if (dwarf_dieoffset(return_die, &return_offset, &error) == DW_DLV_OK) - { - PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Offset = return_offset; + dwarf_dealloc(dbg, atlist, DW_DLA_LIST); } - - for (Dwarf_Signed i = 0; i < atcnt; ++i) + break; + + case DW_TAG_base_type: + case DW_TAG_typedef: + case DW_TAG_structure_type: + case DW_TAG_pointer_type: + case DW_TAG_const_type: + case DW_TAG_array_type: + case DW_TAG_subrange_type: + case DW_TAG_subroutine_type: + if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK) { - if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK) + PtrCU[NbCU].PtrTypes = (BaseTypeStruct *)realloc(PtrCU[NbCU].PtrTypes, ((PtrCU[NbCU].NbTypes + 1) * sizeof(BaseTypeStruct))); + memset(PtrCU[NbCU].PtrTypes + PtrCU[NbCU].NbTypes, 0, sizeof(BaseTypeStruct)); + PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Tag = return_tagval; + + if (dwarf_dieoffset(return_die, &return_offset, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Offset = return_offset; + } + + for (Dwarf_Signed i = 0; i < atcnt; ++i) { - if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK) + if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK) { - switch (return_attr) + if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK) { - case DW_AT_type: - if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK) + switch (return_attr) { - PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].TypeOffset = return_offset; - } - break; + case DW_AT_type: + if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].TypeOffset = return_offset; + } + break; - case DW_AT_byte_size: - if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK) - { - PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].ByteSize = return_uvalue; - } - break; + case DW_AT_byte_size: + if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].ByteSize = return_uvalue; + } + break; - case DW_AT_encoding: - if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK) - { - PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Encoding = return_uvalue; - } - break; + case DW_AT_encoding: + if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Encoding = return_uvalue; + } + break; - case DW_AT_name: - if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK) - { - PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName = (char *)calloc(strlen(return_string) + 1, 1); - strcpy(PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName, return_string); - dwarf_dealloc(dbg, return_string, DW_DLA_STRING); - } - break; + case DW_AT_name: + if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName = (char *)calloc(strlen(return_string) + 1, 1); + strcpy(PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName, return_string); + dwarf_dealloc(dbg, return_string, DW_DLA_STRING); + } + break; - default: - break; + default: + break; + } } } - } - dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR); - } - - PtrCU[NbCU].NbTypes++; + dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR); + } - dwarf_dealloc(dbg, atlist, DW_DLA_LIST); - } - break; + PtrCU[NbCU].NbTypes++; - case DW_TAG_subprogram: - if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK) - { - PtrCU[NbCU].PtrSubProgs = (SubProgStruct *)realloc(PtrCU[NbCU].PtrSubProgs, ((PtrCU[NbCU].NbSubProgs + 1) * sizeof(SubProgStruct))); - memset((void *)(PtrCU[NbCU].PtrSubProgs + PtrCU[NbCU].NbSubProgs), 0, sizeof(SubProgStruct)); - PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].Tag = return_tagval; + dwarf_dealloc(dbg, atlist, DW_DLA_LIST); + } + break; - for (Dwarf_Signed i = 0; i < atcnt; ++i) + case DW_TAG_subprogram: + if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK) { - if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK) + PtrCU[NbCU].PtrSubProgs = (SubProgStruct *)realloc(PtrCU[NbCU].PtrSubProgs, ((PtrCU[NbCU].NbSubProgs + 1) * sizeof(SubProgStruct))); + memset((void *)(PtrCU[NbCU].PtrSubProgs + PtrCU[NbCU].NbSubProgs), 0, sizeof(SubProgStruct)); + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].Tag = return_tagval; + + for (Dwarf_Signed i = 0; i < atcnt; ++i) { - if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK) + if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK) { - switch (return_attr) + if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK) { - case DW_AT_low_pc: - if (dwarf_lowpc(return_die, &return_lowpc, &error) == DW_DLV_OK) + switch (return_attr) { - PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].StartPC = return_lowpc; - PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].LowPC = return_lowpc; - } - break; + case DW_AT_low_pc: + if (dwarf_lowpc(return_die, &return_lowpc, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].StartPC = return_lowpc; + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].LowPC = return_lowpc; + } + break; - case DW_AT_high_pc: - if (dwarf_highpc(return_die, &return_highpc, &error) == DW_DLV_OK) - { - PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].HighPC = return_highpc; - } - break; + case DW_AT_high_pc: + if (dwarf_highpc(return_die, &return_highpc, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].HighPC = return_highpc; + } + break; - case DW_AT_decl_line: - if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK) - { - PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NumLineSrc = return_uvalue; - } - break; + case DW_AT_decl_line: + if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NumLineSrc = return_uvalue; + } + break; - case DW_AT_name: - if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK) - { - PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName = (char *)calloc(strlen(return_string) + 1, 1); - strcpy(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName, return_string); - dwarf_dealloc(dbg, return_string, DW_DLA_STRING); - } - break; + case DW_AT_name: + if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName = (char *)calloc(strlen(return_string) + 1, 1); + strcpy(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName, return_string); + dwarf_dealloc(dbg, return_string, DW_DLA_STRING); + } + break; - default: - break; + default: + break; + } } } + dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR); } - dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR); - } - dwarf_dealloc(dbg, atlist, DW_DLA_LIST); + dwarf_dealloc(dbg, atlist, DW_DLA_LIST); - for (i = 0; i < (size_t)cnt; ++i) - { - if (dwarf_lineaddr(linebuf[i], &return_lineaddr, &error) == DW_DLV_OK) + for (i = 0; i < (size_t)cnt; ++i) { - if (dwarf_lineno(linebuf[i], &return_uvalue, &error) == DW_DLV_OK) + if (dwarf_lineaddr(linebuf[i], &return_lineaddr, &error) == DW_DLV_OK) { - if ((return_lineaddr >= return_lowpc) && (return_lineaddr <= return_highpc)) + if (dwarf_lineno(linebuf[i], &return_uvalue, &error) == DW_DLV_OK) { - 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)); - memset((void *)(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc), 0, sizeof(DMIStruct_LineSrc)); - PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].StartPC = return_lineaddr; - PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].NumLineSrc = return_uvalue; - PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc++; + if ((return_lineaddr >= return_lowpc) && (return_lineaddr <= return_highpc)) + { + 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)); + memset((void *)(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc), 0, sizeof(DMIStruct_LineSrc)); + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].StartPC = return_lineaddr; + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].NumLineSrc = return_uvalue; + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc++; + } } } - } + } + + PtrCU[NbCU].NbSubProgs++; } - - PtrCU[NbCU].NbSubProgs++; - } - break; + break; - default: - break; + default: + break; + } } - } + } while (dwarf_siblingof(dbg, return_sib, &return_die, &error) == DW_DLV_OK); } - while (dwarf_siblingof(dbg, return_sib, &return_die, &error) == DW_DLV_OK); - } - // Release the memory used by the source lines - for (i = 0; i < (size_t)cnt; ++i) - dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE); - dwarf_dealloc(dbg, linebuf, DW_DLA_LIST); - } + // Release the memory used by the source lines + for (i = 0; i < (size_t)cnt; ++i) + dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE); + dwarf_dealloc(dbg, linebuf, DW_DLA_LIST); + } - // Set the source code lines for QT html/text conformity - if (PtrCU[NbCU].NbLinesLoadSrc) - { - if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(PtrCU[NbCU].NbLinesLoadSrc, sizeof(char *))) + // Set the source code lines for QT html/text conformity + if (PtrCU[NbCU].NbLinesLoadSrc) { - for (j = 0; j < PtrCU[NbCU].NbLinesLoadSrc; j++) + if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(PtrCU[NbCU].NbLinesLoadSrc, sizeof(char *))) { - if (PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)calloc(10000, sizeof(char))) + for (j = 0; j < PtrCU[NbCU].NbLinesLoadSrc; j++) { - if (Ptr = DWARFManager_GetLineSrcFromNumLine(PtrCU[NbCU].PtrLoadSrc, (j + 1))) + if (PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)calloc(10000, sizeof(char))) { - i = 0; - - while (*Ptr) + if (Ptr = DWARFManager_GetLineSrcFromNumLine(PtrCU[NbCU].PtrLoadSrc, (j + 1))) { - switch (*Ptr) + i = 0; + + while (*Ptr) { - case 9: - strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], " "); - i += strlen(" "); - break; - - case '<': - strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "<"); - i += strlen("<"); - break; - - case '>': - strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], ">"); - i += strlen(">"); - break; + switch (*Ptr) + { + case 9: + strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], " "); + i += strlen(" "); + break; + + case '<': + strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "<"); + i += strlen("<"); + break; + + case '>': + strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], ">"); + i += strlen(">"); + break; #if 0 - case '&': - strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], "&"); - i += strlen("&"); - break; + case '&': + strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], "&"); + i += strlen("&"); + break; #endif #if 0 - case '"': - strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], """); - i += strlen("""); - break; + case '"': + strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], """); + i += strlen("""); + break; #endif - default: - PtrCU[NbCU].PtrLinesLoadSrc[j][i++] = *Ptr; - break; + default: + PtrCU[NbCU].PtrLinesLoadSrc[j][i++] = *Ptr; + break; + } + Ptr++; } - Ptr++; } + PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)realloc(PtrCU[NbCU].PtrLinesLoadSrc[j], i + 1); } - PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)realloc(PtrCU[NbCU].PtrLinesLoadSrc[j], i + 1); } } } - } - else - { - // Set each source lines pointer to NULL - if (PtrCU[NbCU].NbSubProgs) + else { - i = PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].NbLinesSrc - 1].NumLineSrc; - if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(i, sizeof(char *))) + // Set each source lines pointer to NULL + if (PtrCU[NbCU].NbSubProgs) { - for (j = 0; j < i; j++) + i = PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].NbLinesSrc - 1].NumLineSrc; + if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(i, sizeof(char *))) { - PtrCU[NbCU].PtrLinesLoadSrc[j] = NULL; + for (j = 0; j < i; j++) + { + PtrCU[NbCU].PtrLinesLoadSrc[j] = NULL; + } } } } - } - // Init lines source information based on each source code line numbers - for (j = 0; j < PtrCU[NbCU].NbSubProgs; j++) - { - PtrCU[NbCU].PtrSubProgs[j].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrSubProgs[j].NumLineSrc - 1]; - - for (k = 0; k < PtrCU[NbCU].PtrSubProgs[j].NbLinesSrc; k++) + // Init lines source information based on each source code line numbers + for (j = 0; j < PtrCU[NbCU].NbSubProgs; j++) { - PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc - 1]; - } - } + // Check if the subprog / function's line exists in the source code + if (PtrCU[NbCU].PtrSubProgs[j].NumLineSrc <= PtrCU[NbCU].NbLinesLoadSrc) + { + PtrCU[NbCU].PtrSubProgs[j].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrSubProgs[j].NumLineSrc - 1]; + } - // Init variables information based on types information - for (i = 0; i < PtrCU[NbCU].NbVariables; i++) - { - PtrCU[NbCU].PtrVariables[i].PtrTypeName = (char *)calloc(1000, 1); - TypeOffset = PtrCU[NbCU].PtrVariables[i].TypeOffset; + for (k = 0; k < PtrCU[NbCU].PtrSubProgs[j].NbLinesSrc; k++) + { + PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc - 1]; + } + } - for (j = 0; j < PtrCU[NbCU].NbTypes; j++) + // Init variables information based on types information + for (i = 0; i < PtrCU[NbCU].NbVariables; i++) { - if (TypeOffset == PtrCU[NbCU].PtrTypes[j].Offset) + PtrCU[NbCU].PtrVariables[i].PtrTypeName = (char *)calloc(1000, 1); + TypeOffset = PtrCU[NbCU].PtrVariables[i].TypeOffset; + + for (j = 0; j < PtrCU[NbCU].NbTypes; j++) { - switch (PtrCU[NbCU].PtrTypes[j].Tag) + if (TypeOffset == PtrCU[NbCU].PtrTypes[j].Offset) { - case DW_TAG_structure_type: - PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x1; - if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) - { - j = -1; - } - else + switch (PtrCU[NbCU].PtrTypes[j].Tag) { - if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x2)) + case DW_TAG_structure_type: + PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x1; + if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) { - strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, " *"); + j = -1; } - } - break; + else + { + if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x2)) + { + strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, " *"); + } + } + break; - case DW_TAG_pointer_type: - PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x2; - PtrCU[NbCU].PtrVariables[i].TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize; - PtrCU[NbCU].PtrVariables[i].TypeEncoding = 0x10; - if (!(TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) - { - strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "void *"); - } - else - { - j = -1; - } - break; + case DW_TAG_pointer_type: + PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x2; + PtrCU[NbCU].PtrVariables[i].TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize; + PtrCU[NbCU].PtrVariables[i].TypeEncoding = 0x10; + if (!(TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) + { + strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "void *"); + } + else + { + j = -1; + } + break; - case DW_TAG_typedef: - PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x20; - strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName); - if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) - { - j = -1; - } - break; + case DW_TAG_typedef: + PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x20; + strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName); + if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) + { + j = -1; + } + break; - case DW_TAG_subrange_type: - PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x4; - break; + case DW_TAG_subrange_type: + PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x4; + break; - case DW_TAG_array_type: - PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x8; - if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) - { - j = -1; - } - break; + case DW_TAG_array_type: + PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x8; + if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) + { + j = -1; + } + break; - case DW_TAG_const_type: - PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x10; - strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "const "); - if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) - { - j = -1; - } - break; + case DW_TAG_const_type: + PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x10; + strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "const "); + if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) + { + j = -1; + } + break; - case DW_TAG_base_type: - strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName); - if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x2)) - { - strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, " *"); - } - else - { - PtrCU[NbCU].PtrVariables[i].TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize; - PtrCU[NbCU].PtrVariables[i].TypeEncoding = PtrCU[NbCU].PtrTypes[j].Encoding; - } - if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x8)) - { - strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "[]"); - } - break; + case DW_TAG_base_type: + strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName); + if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x2)) + { + strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, " *"); + } + else + { + PtrCU[NbCU].PtrVariables[i].TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize; + PtrCU[NbCU].PtrVariables[i].TypeEncoding = PtrCU[NbCU].PtrTypes[j].Encoding; + } + if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x8)) + { + strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "[]"); + } + break; - default: - break; + default: + break; + } } } } @@ -1173,7 +1186,14 @@ char *DWARFManager_GetLineSrcFromNumLineBaseAdr(size_t Adr, size_t NumLine) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { - return PtrCU[i].PtrLinesLoadSrc[NumLine - 1]; + if (NumLine <= PtrCU[i].NbLinesLoadSrc) + { + return PtrCU[i].PtrLinesLoadSrc[NumLine - 1]; + } + else + { + return NULL; + } } } -- 2.20.1