From e27f08e7509c28359f4708f57c59d8f784414a7b Mon Sep 17 00:00:00 2001 From: Jean-Paul Mari Date: Mon, 16 Mar 2020 08:36:47 -0400 Subject: [PATCH] Modified the call stack layout window and added source filename from the called source line --- docs/vj_HistoryNotes.txt | 1 + src/debugger/DWARFManager.cpp | 8 ++++-- src/debugger/callstackbrowser.cpp | 42 +++++++++++++++++++------------ 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/docs/vj_HistoryNotes.txt b/docs/vj_HistoryNotes.txt index e0ecc8b..7f3e7ab 100644 --- a/docs/vj_HistoryNotes.txt +++ b/docs/vj_HistoryNotes.txt @@ -15,6 +15,7 @@ Release 5 (TBA) 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 Release 4a (15th August 2019) ----------------------------- diff --git a/src/debugger/DWARFManager.cpp b/src/debugger/DWARFManager.cpp index fe18d00..0640f90 100644 --- a/src/debugger/DWARFManager.cpp +++ b/src/debugger/DWARFManager.cpp @@ -1322,14 +1322,18 @@ char *DWARFManager_GetSymbolnameFromAdr(size_t Adr) // Get complete source filename based from address // Return NULL if no source filename exists -// Return the existence status (true or false) in Error +// Return the existence status (true or false) in Error if pointer not NULL char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error) { for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { - *Error = PtrCU[i].PtrLoadSrc ? true : false; + if (Error) + { + *Error = PtrCU[i].PtrLoadSrc ? true : false; + } + return PtrCU[i].PtrFullFilename; } } diff --git a/src/debugger/callstackbrowser.cpp b/src/debugger/callstackbrowser.cpp index 0d30213..241d47b 100644 --- a/src/debugger/callstackbrowser.cpp +++ b/src/debugger/callstackbrowser.cpp @@ -5,12 +5,13 @@ // // JPM = Jean-Paul Mari // -// Who When What -// --- ---------- ----------------------------------------------------------- -// JPM 08/31/2018 Created this file -// JPM 09/12/2018 Added a status bar and better status report -// JPM 10/20/2018 Added the return address information in the call stack -// JPM 08/09/2019 Prevent crash in case of call stack is out of range +// Who When (M/D/Y) What +// --- ------------ ----------------------------------------------------------- +// JPM 08/31/2018 Created this file +// JPM 09/12/2018 Added a status bar and better status report +// JPM 10/20/2018 Added the return address information in the call stack +// JPM 08/09/2019 Prevent crash in case of call stack is out of range +// JPM 03/16/2020 Modified the layout window and added source filename from the called source line // STILL TO DO: // To set the information display at the right @@ -48,10 +49,11 @@ layout(new QVBoxLayout) layout->addWidget(text); #else // Set the new layout with proper identation and readibility - model->setColumnCount(3); - model->setHeaderData(0, Qt::Horizontal, QObject::tr("Name")); + model->setColumnCount(4); + model->setHeaderData(0, Qt::Horizontal, QObject::tr("Function")); model->setHeaderData(1, Qt::Horizontal, QObject::tr("Line")); model->setHeaderData(2, Qt::Horizontal, QObject::tr("Return address")); + model->setHeaderData(3, Qt::Horizontal, QObject::tr("Filename")); // Information table TableView->setModel(model); TableView->setEditTriggers(QAbstractItemView::NoEditTriggers); @@ -79,14 +81,15 @@ void CallStackBrowserWindow::RefreshContents(void) { char msg[1024]; size_t Error = CS_NOERROR; + bool FilenameError; unsigned int a6, Sa6, ret; - char *FuncName; + char *Name; + size_t NumError = 0; #ifdef CS_LAYOUTTEXTS QString CallStack; char string[1024]; #else int NbRaw = 0; - size_t NumError = 0; QString FunctionName; #endif @@ -104,26 +107,33 @@ void CallStackBrowserWindow::RefreshContents(void) a6 = GET32(jaguarMainRAM, Sa6); ret = GET32(jaguarMainRAM, Sa6 + 4); #ifdef CS_LAYOUTTEXTS - sprintf(string, "0x%06X | Ret: 0x%06X | From: %s - 0x%06X | Line: %s", Sa6, ret, (FuncName = DBGManager_GetFunctionName(ret)), (unsigned int)DBGManager_GetAdrFromSymbolName(FuncName), DBGManager_GetLineSrcFromAdr(ret, DBG_NO_TAG)); + sprintf(string, "0x%06X | Ret: 0x%06X | From: %s - 0x%06X | Line: %s", Sa6, ret, (Name = DBGManager_GetFunctionName(ret)), (unsigned int)DBGManager_GetAdrFromSymbolName(Name), DBGManager_GetLineSrcFromAdr(ret, DBG_NO_TAG)); CallStack += QString(string); if (a6) { CallStack += QString("
"); } #else + // insert line model->insertRow(NbRaw); - model->setItem(NbRaw, 0, new QStandardItem(QString("%1").arg((FuncName = DBGManager_GetFunctionName(ret)) ? FuncName : "(N/A)"))); - FunctionName = QString(FuncName = DBGManager_GetLineSrcFromAdr(ret, DBG_NO_TAG)); + // display the function name + model->setItem(NbRaw, 0, new QStandardItem(QString("%1").arg((Name = DBGManager_GetFunctionName(ret)) ? Name : "(N/A)"))); + // display the called line + FunctionName = QString(Name = DBGManager_GetLineSrcFromAdr(ret, DBG_NO_TAG)); FunctionName.replace(" ", " "); - model->setItem(NbRaw, 1, new QStandardItem(QString("%1").arg(FuncName ? FunctionName : "(N/A)"))); + FunctionName = FunctionName.trimmed(); + model->setItem(NbRaw, 1, new QStandardItem(QString("%1").arg(Name ? FunctionName : "(N/A)"))); + // display the return address sprintf(msg, "0x%06X", ret); - model->setItem(NbRaw++, 2, new QStandardItem(QString("%1").arg(msg))); + 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)"))); +#endif } else { NumError = 0x1; } -#endif } #ifdef CS_LAYOUTTEXTS text->clear(); -- 2.20.1