// JPM Dec./2016 Created this file, and added the DWARF format support\r
// JPM Sept./2018 Added LEB128 decoding features, and improve the DWARF parsing information\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 Mar./2020 Fix a random crash when reading the source lines information\r
//\r
\r
// To Do\r
\r
\r
// Definitions for debugging\r
-//#define DEBUG_NumCU 0xf // CU number to debug or undefine it\r
+//#define DEBUG_NumCU 0x4d // CU number to debug or undefine it\r
//#define DEBUG_VariableName "sound_death" // Variable name to look for or undefine it\r
//#define DEBUG_TypeName "Cbuf_Execute" // Type name to look for or undefine it\r
//#define DEBUG_TypeDef DW_TAG_typedef // Type def to look for or undefine it (not supported)\r
{\r
if (dwarf_lineaddr(linebuf[i], &return_lineaddr, &error) == DW_DLV_OK)\r
{\r
+ // Get the source line number\r
if (dwarf_lineno(linebuf[i], &return_uvalue, &error) == DW_DLV_OK)\r
{\r
PtrCU[NbCU].PtrLinesSrc[i].StartPC = return_lineaddr;\r
}\r
}\r
}\r
+\r
+ // Release the memory used by the source lines table located in the CU\r
+ dwarf_srclines_dealloc(dbg, linebuf, cnt);\r
}\r
\r
// Check if the CU has child\r
// Get source line number and associated block of address\r
for (Dwarf_Signed i = 0; i < cnt; ++i)\r
{\r
- if (dwarf_lineaddr(linebuf[i], &return_lineaddr, &error) == DW_DLV_OK)\r
+ if ((PtrCU[NbCU].PtrLinesSrc[i].StartPC >= return_lowpc) && (PtrCU[NbCU].PtrLinesSrc[i].StartPC <= return_highpc))\r
{\r
- if (dwarf_lineno(linebuf[i], &return_uvalue, &error) == DW_DLV_OK)\r
- {\r
- if ((return_lineaddr >= return_lowpc) && (return_lineaddr <= 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
- PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].StartPC = return_lineaddr;\r
- PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].NumLineSrc = return_uvalue;\r
- PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc++;\r
- }\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
+ PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].StartPC = PtrCU[NbCU].PtrLinesSrc[i].StartPC;\r
+ PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].NumLineSrc = PtrCU[NbCU].PtrLinesSrc[i].NumLineSrc;\r
+ PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc++;\r
}\r
}\r
\r
}\r
while (dwarf_siblingof(dbg, return_sib, &return_die, &error) == DW_DLV_OK);\r
}\r
-\r
- // Release the memory used by the source lines\r
- for (Dwarf_Signed i = 0; i < cnt; ++i)\r
- {\r
- dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE);\r
- }\r
- dwarf_dealloc(dbg, linebuf, DW_DLA_LIST);\r
}\r
\r
// Set the source code lines for QT html/text conformity\r