Developer forums (C::B DEVELOPMENT STRICTLY!) > Development

Code::Blocks debugger plugin and Cygwin

<< < (3/4) > >>

bugshunter69:
Ok, :o
thank you, but I don't want to contribute to Code::Blocks.

I'm sorry, it was only a simple modification to make debugger usable under cygwin.

If someone will needs the patch file 'gdb_driver.cpp.patch' (unified diff format) I send to him.

I checked out the sources from 'svn://svn.berlios.de/codeblocks/trunk' the revision 7663 and I think that no one modified (patched) for our problem!

Bye
B.

MortenMacFly:

--- Quote from: bugshunter69 on January 14, 2012, 11:02:02 pm ---If someone will needs the patch file 'gdb_driver.cpp.patch' (unified diff format) I send to him.

--- End quote ---
Please post it as "svn diff" here, using code tags and (at best) applied against debugger branch. That would be nice.

bugshunter69:
MortenMacFly,
this is "svn diff" against "debugger branch" (svn://svn.berlios.de/codeblocks/branches/wxpropgrid_debugger).

In "debugger branch" I saw that breakpoints works (without this patch) fine also in cygwin.

But, I hope will be useful.

Bye
B.


--- Code: ---Index: gdb_driver.cpp
===================================================================
--- gdb_driver.cpp (revision 7698)
+++ gdb_driver.cpp (working copy)
@@ -670,6 +670,27 @@
 
 void GDB_driver::AddBreakpoint(DebuggerBreakpoint::Pointer bp)
 {
+    wxString SaveFileName(bp->filename);
+    if(platform::windows && m_CygwinPresent==true)
+    {
+        wxString FileName(bp->filename);
+
+        if (FileName.GetChar(1) == _T(':'))
+        {
+            wxString m_CygdrivePrefixNormalized;
+            if (m_CygdrivePrefix.EndsWith(_T("/"))) // for the case   "/cygdrive/"
+              m_CygdrivePrefixNormalized = m_CygdrivePrefix;
+            else                                    // for cases e.g. "/cygdrive"
+              m_CygdrivePrefixNormalized = m_CygdrivePrefix + _T("/");
+            // replace drive letter with cygwin prefix and adding the drive label back
+            if (FileName.GetChar(2) == _T('/'))
+                FileName.Replace(FileName.Left(1) + _T(":") + _T("/"), m_CygdrivePrefixNormalized + FileName.Left(1).Lower() + _T("/"), false);
+            else
+                FileName.Replace(FileName.Left(1) + _T(":"), m_CygdrivePrefixNormalized + FileName.Left(1).Lower() + _T("/"), false);
+
+        }
+        bp->filename = FileName;
+    }
     if (bp->type == DebuggerBreakpoint::bptData)
     {
         QueueCommand(new GdbCmd_AddDataBreakpoint(this, bp));
@@ -701,6 +722,7 @@
 
         QueueCommand(new GdbCmd_AddBreakpoint(this, bp));
     }
+    bp->filename = SaveFileName;
 }
 
 void GDB_driver::RemoveBreakpoint(DebuggerBreakpoint::Pointer bp)

--- End code ---

oBFusCATed:
Anyone with cygwin and problems with breakpoints willing to test this patch?

bugshunter69:
Hi,
I realized that the previous patch doesn't work with MINGW's GDB (debuggger branch).

So I wrote a new one.

Bye
B.


--- Code: ---Index: gdb_driver.cpp
===================================================================
--- gdb_driver.cpp (revision 7698)
+++ gdb_driver.cpp (working copy)
@@ -87,6 +87,8 @@
 GDB_driver::GDB_driver(DebuggerGDB* plugin)
     : DebuggerDriver(plugin),
     m_CygwinPresent(false),
+    m_GDBTargetIsCygwin(false),
+    m_GDBTargetIsMingw32(false),
     m_BreakOnEntry(false),
     m_ManualBreakOnEntry(false),
     m_IsStarted(false),
@@ -223,6 +225,19 @@
     if(platform::windows)
         DetectCygwinMount();
 
+    // log GDB's target
+    wxString cmdexe;
+    cmdexe = m_pDBG->GetActiveConfigEx().GetDebuggerExecutable();
+    if (cmdexe.Lower().Contains(_T("mingw")))
+        m_GDBTargetIsMingw32 = true;
+    if (cmdexe.Lower().Contains(_T("cygwin")))
+    {
+        m_GDBTargetIsCygwin = true;
+        if (m_CygwinPresent == false)
+            m_CygdrivePrefix = _T("/cygdrive/");
+
+    }
+
     // make sure we 're using the prompt that we know and trust ;)
     QueueCommand(new DebuggerCmd(this, wxString(_T("set prompt ")) + FULL_GDB_PROMPT));
 
@@ -670,6 +685,27 @@
 
 void GDB_driver::AddBreakpoint(DebuggerBreakpoint::Pointer bp)
 {
+    wxString SaveFileName(bp->filename);
+    if(platform::windows && m_GDBTargetIsMingw32==false && m_GDBTargetIsCygwin==true)
+    {
+        wxString FileName(bp->filename);
+
+        if (FileName.GetChar(1) == _T(':'))
+        {
+            wxString m_CygdrivePrefixNormalized;
+            if (m_CygdrivePrefix.EndsWith(_T("/"))) // for the case   "/cygdrive/"
+              m_CygdrivePrefixNormalized = m_CygdrivePrefix;
+            else                                    // for cases e.g. "/cygdrive"
+              m_CygdrivePrefixNormalized = m_CygdrivePrefix + _T("/");
+            // replace drive letter with cygwin prefix and adding the drive label back
+            if (FileName.GetChar(2) == _T('/'))
+                FileName.Replace(FileName.Left(1) + _T(":") + _T("/"), m_CygdrivePrefixNormalized + FileName.Left(1).Lower() + _T("/"), false);
+            else
+                FileName.Replace(FileName.Left(1) + _T(":"), m_CygdrivePrefixNormalized + FileName.Left(1).Lower() + _T("/"), false);
+
+        }
+        bp->filename = FileName;
+    }
     if (bp->type == DebuggerBreakpoint::bptData)
     {
         QueueCommand(new GdbCmd_AddDataBreakpoint(this, bp));
@@ -701,6 +737,7 @@
 
         QueueCommand(new GdbCmd_AddBreakpoint(this, bp));
     }
+    bp->filename = SaveFileName;
 }
 
 void GDB_driver::RemoveBreakpoint(DebuggerBreakpoint::Pointer bp)
Index: gdb_driver.h
===================================================================
--- gdb_driver.h (revision 7698)
+++ gdb_driver.h (working copy)
@@ -105,6 +105,9 @@
         bool m_CygwinPresent;
         wxString m_CygdrivePrefix;
 
+        bool m_GDBTargetIsCygwin;
+        bool m_GDBTargetIsMingw32;
+
         TypesArray m_Types;
 
         // Seems to be intended to allow step before program has started.

--- End code ---

Navigation

[0] Message Index

[#] Next page

[*] Previous page

Go to full version