Handling of external debugger usage...

W. Tasin tasin at fhm.edu
Sat Mar 23 16:12:03 UTC 2002


The following patch was applied by me, after some long testings.
It handles a crash if external debugging is enabled and we try to debug 
an app with arguments.

I also changed the patch of Harry (as mentioned before).

Please check. If there are objections I will revert the changings.

Ciao

Walter

jbb wrote:

>- There are some ASSERTS in the code especially on starting the 
>debugger, while the extern debugger is in use.
>  I think, we should remove the ASSERTS (because they can cause a crash) 
>and the slotMethods for debugging should all check first for the 
>variable dbgInternal (AFAICS debugging with arguments doesn't check it, 
>maybe there are some others)
>
.....

>
>I know this is not what you wanted, but those ASSERTS should be okay. They 
>shouldn't be triggered with this patch. If they are then somethings wrong. If 
>you still feel they should be removed then I'll not object to doing it. Just 
>let me know
>
They are ok... so I left them inside.
It's only that from time to time we would fall into it if some patches 
were made which don't consider certain conditions.

>
>
>jbb
>
>
>------------------------------------------------------------------------
>
>? build_configured
>? build_initialised
>? config.hlp
>? stamp-h1
>Index: kdevelop/ckdevelop.cpp
>===================================================================
>RCS file: /home/kde/kdevelop/kdevelop/Attic/ckdevelop.cpp,v
>retrieving revision 1.158.2.114.2.140.2.36
>diff -u -r1.158.2.114.2.140.2.36 ckdevelop.cpp
>--- kdevelop/ckdevelop.cpp	2002/03/09 13:35:52	1.158.2.114.2.140.2.36
>+++ kdevelop/ckdevelop.cpp	2002/03/16 04:23:39
>@@ -1604,17 +1604,22 @@
> 
> void CKDevelop::slotStartDebugRunWithArgs()
> {
>- 	KComboBox* compile_combo = toolBar(ID_BROWSER_TOOLBAR)->getCombo(ID_CV_TOOLBAR_COMPILE_CHOICE);
>-	QString conf=compile_combo->currentText();
>+  // This "fixes" crash when external debugger is being used. We cannot pass
>+  // arguments to an external debugger without quite a bit more work being done
>+  if (!dbgInternal)
>+    return;
>+
>+  KComboBox* compile_combo = toolBar(ID_BROWSER_TOOLBAR)->getCombo(ID_CV_TOOLBAR_COMPILE_CHOICE);
>+  QString conf=compile_combo->currentText();
>   QString runFromDir;
>   if(conf==i18n("(Default)"))
>-		runFromDir = prj->getRunFromDir();
>-	else{
>-		runFromDir = m_pKDevSession->getVPATHSubdir(conf);
>-		if(runFromDir.right(1)!="/")
>-			runFromDir+="/";
>-		runFromDir+=prj->getSubDir();
>-	}
>+    runFromDir = prj->getRunFromDir();
>+  else{
>+    runFromDir = m_pKDevSession->getVPATHSubdir(conf);
>+    if(runFromDir.right(1)!="/")
>+      runFromDir+="/";
>+    runFromDir+=prj->getSubDir();
>+  }
>   QDir::setCurrent(runFromDir);
>   QString libtool     = prj->getLibtool();;
>   QString binProgram  = prj->getExecutable();
>Index: kdevelop/ckdevelop.h
>===================================================================
>RCS file: /home/kde/kdevelop/kdevelop/Attic/ckdevelop.h,v
>retrieving revision 1.105.2.37.2.88.2.10
>diff -u -r1.105.2.37.2.88.2.10 ckdevelop.h
>--- kdevelop/ckdevelop.h	2002/03/09 13:35:52	1.105.2.37.2.88.2.10
>+++ kdevelop/ckdevelop.h	2002/03/16 04:23:45
>@@ -940,9 +940,10 @@
>   QPopupMenu* build_menu;
>   QPopupMenu* debug_menu;
>   QPopupMenu* debugPopup;
>+  QPopupMenu* debugToolPopup;
>   QPopupMenu* tools_menu;
>   QPopupMenu* options_menu;
>-  KHelpMenu* help_menu;
>+  KHelpMenu*  help_menu;
>   QWhatsThis* whats_this;
> 
>   QPopupMenu* history_prev;
>Index: kdevelop/ckdevelop_init.cpp
>===================================================================
>RCS file: /home/kde/kdevelop/kdevelop/Attic/ckdevelop_init.cpp,v
>retrieving revision 1.131.2.63.2.125.2.14
>diff -u -r1.131.2.63.2.125.2.14 ckdevelop_init.cpp
>--- kdevelop/ckdevelop_init.cpp	2002/03/07 21:25:27	1.131.2.63.2.125.2.14
>+++ kdevelop/ckdevelop_init.cpp	2002/03/16 04:23:57
>@@ -787,7 +787,7 @@
>   toolBar()->insertButton("rebuild",ID_BUILD_REBUILD_ALL, false,i18n("Rebuild"));
> //  toolBar()->insertSeparator();
>   toolBar()->insertButton("debugger",ID_DEBUG_START, false, i18n("Debug"));
>-  QPopupMenu* debugToolPopup = new QPopupMenu();
>+  debugToolPopup = new QPopupMenu();
>   debugToolPopup->insertItem(SmallIconSet("core"),i18n("Examine core file"),this,SLOT(slotDebugExamineCore()),0,ID_DEBUG_CORE);
>   debugToolPopup->insertItem(SmallIconSet("exec"),i18n("Debug another executable"),this,SLOT(slotDebugNamedFile()),0,ID_DEBUG_NAMED_FILE);
>   debugToolPopup->insertItem(SmallIconSet("connect_creating"),i18n("Attach to process"),this,SLOT(slotDebugAttach()),0,ID_DEBUG_ATTACH);
>Index: kdevelop/ckdevelop_noslot.cpp
>===================================================================
>RCS file: /home/kde/kdevelop/kdevelop/Attic/ckdevelop_noslot.cpp,v
>retrieving revision 1.72.2.41.2.89.2.9
>diff -u -r1.72.2.41.2.89.2.9 ckdevelop_noslot.cpp
>--- kdevelop/ckdevelop_noslot.cpp	2002/02/28 12:25:15	1.72.2.41.2.89.2.9
>+++ kdevelop/ckdevelop_noslot.cpp	2002/03/16 04:24:03
>@@ -657,11 +657,26 @@
>     if (m_docViewManager->curDocIsCppFile()){
>       enableCommand(ID_BUILD_COMPILE_FILE);
>     }
>-	  enableCommand(ID_CV_TOOLBAR_COMPILE_CHOICE); // enable switching project configs
>+    enableCommand(ID_CV_TOOLBAR_COMPILE_CHOICE); // enable switching project configs
>     enableCommand(ID_BUILD_RUN);
>     enableCommand(ID_BUILD_RUN_WITH_ARGS);
>     enableCommand(ID_DEBUG_START);
>-    enableCommand(ID_DEBUG_START_OTHER);
>+    if (dbgInternal)
>+    {
>+      enableCommand(ID_DEBUG_START_OTHER);
>+      debugToolPopup->setItemEnabled(ID_DEBUG_CORE,       true);
>+      debugToolPopup->setItemEnabled(ID_DEBUG_NAMED_FILE, true);
>+      debugToolPopup->setItemEnabled(ID_DEBUG_ATTACH,     true);
>+      debugToolPopup->setItemEnabled(ID_DEBUG_SET_ARGS,   true);
>+    }
>+    else
>+    {
>+      disableCommand(ID_DEBUG_START_OTHER);
>+      debugToolPopup->setItemEnabled(ID_DEBUG_CORE,       false);
>+      debugToolPopup->setItemEnabled(ID_DEBUG_NAMED_FILE, false);
>+      debugToolPopup->setItemEnabled(ID_DEBUG_ATTACH,     false);
>+      debugToolPopup->setItemEnabled(ID_DEBUG_SET_ARGS,   false);
>+    }
>     enableCommand(ID_BUILD_MAKE);
>     enableCommand(ID_BUILD_REBUILD_ALL);
>     enableCommand(ID_BUILD_CLEAN_REBUILD_ALL);
>@@ -700,12 +715,16 @@
> //  if (!enable)
>   {
>     // set the popupmenus enable or disable
>-	  disableCommand(ID_CV_TOOLBAR_COMPILE_CHOICE); // disable switching project configs during an operation
>+    disableCommand(ID_CV_TOOLBAR_COMPILE_CHOICE); // disable switching project configs during an operation
>     disableCommand(ID_BUILD_COMPILE_FILE);
>     disableCommand(ID_BUILD_RUN_WITH_ARGS);
>     disableCommand(ID_BUILD_RUN);
>     disableCommand(ID_DEBUG_START);
>     disableCommand(ID_DEBUG_START_OTHER);
>+    debugToolPopup->setItemEnabled(ID_DEBUG_CORE,       false);
>+    debugToolPopup->setItemEnabled(ID_DEBUG_NAMED_FILE, false);
>+    debugToolPopup->setItemEnabled(ID_DEBUG_ATTACH,     false);
>+    debugToolPopup->setItemEnabled(ID_DEBUG_SET_ARGS,   false);
>     disableCommand(ID_BUILD_MAKE);
>     disableCommand(ID_BUILD_REBUILD_ALL);
>     disableCommand(ID_BUILD_CLEAN_REBUILD_ALL);
>

--------------

Here's the patch for Harry's commitment:

diff -u -r1.26.2.21.2.22.2.16 -r1.26.2.21.2.22.2.17
--- cprjoptionsdlg.cpp  2002/03/22 20:16:47     1.26.2.21.2.22.2.16
+++ cprjoptionsdlg.cpp  2002/03/23 13:08:53     1.26.2.21.2.22.2.17
@@ -229,15 +229,32 @@
 // stupid littly helper function to find out whether a desired lib
 // is in the StringList. Returns true if lib1 or lib2 has been found
 // and also removes them from the list.
-bool removeLibFromList( QStringList& libs, const QString& lib1, const 
QString& lib2 = QString::null )
+// This also checks multiple occurrence of the same libname
+bool CPrjOptionsDlg::removeLibFromList( QStringList& libs, const 
QString& lib1,
+               const QString& lib2)
 {
   bool fnd = false;
-  if ( !lib1.isEmpty() && ( libs.remove( lib1 ) > 0 ) ) {
-    fnd = true;
-  }
-  if ( !lib2.isEmpty() && ( libs.remove( lib2 ) > 0 ) ) {
-    fnd = true;
+  QStringList::Iterator it;
+
+  for (it=libs.begin(); it!=libs.end();)
+  {
+    if (!lib1.isEmpty() && (*it)==lib1)
+    {
+      it=libs.remove(it);
+      fnd=true;
+    }
+    else
+    {
+      if (!lib2.isEmpty() && (*it)==lib2)
+      {
+        it=libs.remove(it);
+        fnd=true;
+      }
+      else
+        ++it;
+    }
   }
+
   return fnd;
 }

@@ -385,8 +402,10 @@
   l_math=new QCheckBox(libs_group,"l_math");
   grid4->addWidget (l_math,0,3);
   l_math->setText("math");
-  l_math->setChecked(l_khtml->isChecked() ||
-                     removeLibFromList(ldAdds, "-lm"));
+  /* The order here is important... first remove any additional "-lm" 
string, then test
+     if l_khtml is checked
+  */
+  l_math->setChecked(removeLibFromList(ldAdds, "-lm") || 
l_khtml->isChecked());   QWhatsThis::add(l_math, i18n("Math library"));

   QLabel* addit_ldadd_label;
----
diff -u -r1.11.2.5.2.5.2.6 -r1.11.2.5.2.5.2.7
--- cprjoptionsdlg.h    2002/02/27 12:52:03     1.11.2.5.2.5.2.6
+++ cprjoptionsdlg.h    2002/03/23 13:08:53     1.11.2.5.2.5.2.7
@@ -32,6 +32,8 @@
 class CPrjAddOpts;
 class KDevSession;

+#include <qstring.h>
+#include <qstringlist.h>
 #include <kdialogbase.h>
 #include "cprjconfchange.h"

@@ -57,6 +59,9 @@
   void addLinkerPage();
   void addMakePage();
   void addBinPage();
+  bool removeLibFromList(QStringList& libs, const QString& lib1,
+               const QString& lib2 = QString::null);
+

 protected:
        CPrjCompOpts* compdlg;


-- 
The KDevelop project: tasin at kdevelop.de [www.kdevelop.org]
--
oohhh sveglia.... il mondo e' ammalato, ma x colpa di chi.........
(Zucchero)
:-------W. Tasin, FB 04,FHM-------------------PGP-KeyID:0x7961A645----------:
<Key-Fingerprint: 1610 835F 0080 32F4 6140  6CF7 A7D0 44CD 7961A645>








More information about the KDevelop-devel mailing list