From 973347f3b50ac17ac62441f7a58884501e4e6be1 Mon Sep 17 00:00:00 2001 From: Jean-Paul Mari Date: Wed, 21 Apr 2021 05:04:21 -0400 Subject: [PATCH] Fixed potential crash with the debugger tabs reset Crash occurs during the reset between an executable without debugging information to one with it. --- docs/vj_HistoryNotes.txt | 3 +- src/debugger/SourcesWin.cpp | 63 ++++++++++++++++++++++--------------- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/docs/vj_HistoryNotes.txt b/docs/vj_HistoryNotes.txt index cbbfebe..1df2206 100644 --- a/docs/vj_HistoryNotes.txt +++ b/docs/vj_HistoryNotes.txt @@ -23,7 +23,7 @@ Release 5 (TBA) 15) Remove Visual Studio 2015 support 16) Work around fix for a compilation error on Linux -- EEPROM directory creation allowed only for Windows at the moment -17) Show the SR value as a readable form in the CPU browser +17) Show the SR value as a readable form in the M68K CPU browser 18) Potential fix to compile on Linux -- Added the relative directory path for the Qt include files 19) Merge the Linux build fixes from @richard42 @@ -39,6 +39,7 @@ Release 5 (TBA) 25) Added a #line in the call stack window 26) Add a search feature in the all watches window 27) Added video output display in a specific window +28) Fixed potential crash with the debugger tabs reset Release 4a (15th August 2019) ----------------------------- diff --git a/src/debugger/SourcesWin.cpp b/src/debugger/SourcesWin.cpp index c9b3a0e..5b29fcf 100644 --- a/src/debugger/SourcesWin.cpp +++ b/src/debugger/SourcesWin.cpp @@ -8,8 +8,10 @@ // Who When What // --- ---------- ------------------------------------------------------------- // JPM 08/23/2019 Created this file +// JPM Apr./2021 Fixed potential crash with the tabs reset // STILL TO DO: +// Use the CloseTab signal's value instead to close the current tab // #include @@ -32,21 +34,21 @@ OldCurrentNumLineSrc(0), indexErrorTab(-1), sourceErrorTab(0) { - // Prepare layout + // prepare layout sourcestabWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); sourcestabWidget->setTabsClosable(true); layout->addWidget(sourcestabWidget); - // Set layout + // set layout setLayout(layout); - // Connect the signals + // connect the signals connect(sourcestabWidget, SIGNAL(currentChanged(const int)), this, SLOT(SelectTab(const int))); connect(sourcestabWidget, SIGNAL(tabCloseRequested(const int)), this, SLOT(CloseTab(const int))); } -// Close tab +// Close #tab void SourcesWindow::CloseTab(const int) { CloseCurrentTab(); @@ -70,38 +72,44 @@ void SourcesWindow::SelectTab(const int) // Sources initialisation +// Prepare tabs for every available source code file void SourcesWindow::Init(void) { size_t i, j; char *Ptr, *Ptr1; - // Get number of sources + // get number of sources NbSourcesInfos = DBGManager_GetNbSources(); if (NbSourcesInfos) { - // Alloc structure for the source informations + // alloc structure for the source informations sourcesinfostab = (SourcesInfos *)calloc(NbSourcesInfos, sizeof(SourcesInfos)); - // Fill sources information + // fill sources information for (i = 0; i < NbSourcesInfos; i++) { - // Get source filename without misguiding information + // get source filename without misguiding information Ptr = DBGManager_GetNumSourceFilename(i); Ptr1 = sourcesinfostab[i].Filename = (char *)malloc(strlen(Ptr) + 1); while (((*Ptr == '.') || ((*Ptr == '/') || (*Ptr == '\\'))) && Ptr++); strcpy(Ptr1, Ptr); - // Get texts dedicated information + // get texts dedicated information for (j = 0; j < 2; j++) { sourcesinfostab[i].NbLinesText[j] = DBGManager_GetSrcNbListPtrFromIndex(i, j); } sourcesinfostab[i].NumLinesUsed = DBGManager_GetSrcNumLinesPtrFromIndex(i, true); sourcesinfostab[i].SourceText = DBGManager_GetSrcListPtrFromIndex(i, false); - // Get remaining information + // get remaining information sourcesinfostab[i].Language = DBGManager_GetSrcLanguageFromIndex(i); sourcesinfostab[i].IndexTab = -1; } } + else + { + // no source files exist + sourcesinfostab = NULL; + } } @@ -125,11 +133,13 @@ bool SourcesWindow::GetTraceStatus(void) } -// Check if line has changed +// Check if the line's number has changed across the tabs +// Return true in case of the line is different, otherwise return false bool SourcesWindow::CheckChangeLine(void) { size_t NumLine; + // get the line number based on the current M68K PC address if (NumLine = DBGManager_GetNumLineFromAdr(m68k_get_reg(NULL, M68K_REG_PC), DBG_NO_TAG)) { if (OldCurrentTab == CurrentTab) @@ -145,14 +155,15 @@ bool SourcesWindow::CheckChangeLine(void) OldCurrentTab = CurrentTab; OldCurrentNumLineSrc = 0; } - } return false; } -// +// Refresh tabs +// Open a new tab for a file source code +// Set a unique tab for unavailable source code void SourcesWindow::RefreshContents(void) { size_t m68kPC = m68k_get_reg(NULL, M68K_REG_PC); @@ -161,21 +172,21 @@ void SourcesWindow::RefreshContents(void) DBGstatus Status; char *Filename; - // Check valid PC + // check valid M68K PC address if (m68kPC && NbSourcesInfos) { - // Get source filename pointed by PC address + // get source filename pointed by PC address Filename = DBGManager_GetFullSourceFilenameFromAdr(m68kPC, &Status); if (!Status && Filename) { - // Look for a new tab + // look for a new tab for (i = 0; i < NbSourcesInfos; i++, !index) { if (sourcesinfostab[i].Filename) { if (strstr(Filename, sourcesinfostab[i].Filename)) { - // Open a new tab for a source code + // open a new tab for a source code if (sourcesinfostab[i].IndexTab == -1) { sourcesinfostab[i].IndexTab = index = sourcestabWidget->addTab(sourcesinfostab[i].sourceCtab = new(SourceCWindow), tr(sourcesinfostab[i].Filename)); @@ -193,7 +204,7 @@ void SourcesWindow::RefreshContents(void) } else { - // Source file doesn't exist + // source file doesn't exist if (indexErrorTab == -1) { indexErrorTab = sourcestabWidget->addTab(sourceErrorTab = new(SourceCWindow), tr("Source file not available")); @@ -212,15 +223,15 @@ void SourcesWindow::CloseCurrentTab(void) int Index; QString t = sourcestabWidget->tabText((Index = sourcestabWidget->currentIndex())); - // Check error tab presence + // check error tab presence if (indexErrorTab == Index) { - // Close the error tab + // close the error tab indexErrorTab = -1; } else { - // Close source code text tab + // close source code text tab while ((i < NbSourcesInfos) && strcmp(sourcesinfostab[i++].Filename, t.toLatin1().data())); sourcesinfostab[(i - 1)].IndexTab = -1; } @@ -230,10 +241,10 @@ void SourcesWindow::CloseCurrentTab(void) } -// +// Handle keyboard void SourcesWindow::keyPressEvent(QKeyEvent * e) { - // Close/Remove the current tab + // close/remove the current tab if (e->key() == Qt::Key_Escape) { CloseCurrentTab(); @@ -241,13 +252,13 @@ void SourcesWindow::keyPressEvent(QKeyEvent * e) } -// +// Reset all source files tab void SourcesWindow::Reset(void) { - // Clear the tabs + // clear the tabs sourcestabWidget->clear(); - // Clear tab information + // clear tab information while (NbSourcesInfos) { free(sourcesinfostab[--NbSourcesInfos].Filename); -- 2.20.1