Hi, OBF, see this post:
http://sourceware.org/ml/gdb-patches/2012-03/msg00823.html
I have some discussion with gdb developers, and after the line specification rewrite, the command break "filename:line" will not work anymore, can we use this command with out "quotes" like:
break "filename":line
or
break filename:line
I think it was easy to change in debugger plugin, right?
It this the only place I have to change? in file: gdb_commands.h
class GdbCmd_AddBreakpoint : public DebuggerCmd
{
DebuggerBreakpoint::Pointer m_BP;
public:
/** @param bp The breakpoint to set. */
GdbCmd_AddBreakpoint(DebuggerDriver* driver, DebuggerBreakpoint::Pointer bp)
: DebuggerCmd(driver),
m_BP(bp)
{
// gdb doesn't allow setting the bp number.
// instead, we must read it back in ParseOutput()...
m_BP->index = -1;
if (m_BP->enabled)
{
if (m_BP->type == DebuggerBreakpoint::bptCode)//m_BP->func.IsEmpty())
{
wxString out = m_BP->filename;
// we add one to line, because scintilla uses 0-based line numbers, while gdb uses 1-based
if (!m_BP->temporary)
m_Cmd << _T("break ");
else
m_Cmd << _T("tbreak ");
m_Cmd << _T('"') << out << _T(":") << wxString::Format(_T("%d"), m_BP->line) << _T('"');
Probably.
What version of gdb has this feature? 7.4?
Quote from: oBFusCATed on March 25, 2012, 11:22:21 AM
Probably.
I just remove the double-quote in the break command, and now setting bp works OK under c::b, but it looks like the removing bp works badly, maybe, the parsing output method should be changed also.
Quote
What version of gdb has this feature? 7.4?
This new feature is tested by one gdb developer(in his git gdb branch), I think it will be merged to the main trunk some days later. gdb 7.4 has already released(they won't add any new feature in the 7.4 branch), so I believe it will happen in gdb 7.5.
EDIT: As the change will break many IDE front end, I think there will be further discussions in gdb maillist.
If it is not an official release, you're on your own, sorry. No time to support random gdb-testing-versions.
Quote from: oBFusCATed on March 26, 2012, 06:34:21 AM
If it is not an official release, you're on your own, sorry. No time to support random gdb-testing-versions.
Ok, never mind.
I will follow the discussions in gdb maillist, and response if the break command has changed.
Thanks.
PS: I'm looking forward to test/try your gdb mi plugin when they are ready. :)
You can get it for here: svn://cmpt.benbmp.org/cb_gdb_mi
It should be relatively usable.
Does "filename":line not make a lot more sense anyway, even now? That's assuming the current version supports that, of course.
If the present version supports this variant, I don't see why we should not use it. A line number should not contain anything that needs quoting, only a filename might. Insofar, only quoting the filename is a kind of sensible approach.
Quote from: thomas on March 26, 2012, 12:06:23 PM
Does "filename":line not make a lot more sense anyway, even now? That's assuming the current version supports that, of course.
If the present version supports this variant, I don't see why we should not use it. A line number should not contain anything that needs quoting, only a filename might. Insofar, only quoting the filename is a kind of sensible approach.
The gdb developer Keith strongly suggest that the line number should not be quoted.
This feature
"filename":line does not exist in the current gdb CVS or 7.4 branch, but I guess they still need some test. (Currently, the new line specification has already pass all the gdb build-in tests)
Change our debugger branch code is quite simple. For the
break filename:line
Here is the patch:
Index: E:/code/cb/cb_debugger_branch/src/plugins/debuggergdb/gdb_commands.h
===================================================================
--- E:/code/cb/cb_debugger_branch/src/plugins/debuggergdb/gdb_commands.h (revision 7909)
+++ E:/code/cb/cb_debugger_branch/src/plugins/debuggergdb/gdb_commands.h (working copy)
@@ -131,7 +131,7 @@
// Breakpoint 1 at 0x4013d6: file main.cpp, line 8.
static wxRegEx reBreakpoint(_T("Breakpoint ([0-9]+) at (0x[0-9A-Fa-f]+)"));
// Breakpoint 1 ("/home/jens/codeblocks-build/codeblocks-1.0svn/src/plugins/debuggergdb/gdb_commands.h:125) pending.
-static wxRegEx rePendingBreakpoint(_T("Breakpoint ([0-9]+)[ \t]\\(\\\"(.+):([0-9]+)\\)[ \t]pending\\."));
+static wxRegEx rePendingBreakpoint(_T("Breakpoint ([0-9]+)[ \t]\\((.+):([0-9]+)\\)[ \t]pending\\."));
// Hardware assisted breakpoint 1 at 0x4013d6: file main.cpp, line 8.
static wxRegEx reHWBreakpoint(_T("Hardware assisted breakpoint ([0-9]+) at (0x[0-9A-Fa-f]+)"));
// Hardware watchpoint 1: expr
@@ -448,7 +448,7 @@
m_Cmd << _T("break ");
else
m_Cmd << _T("tbreak ");
- m_Cmd << _T('"') << out << _T(":") << wxString::Format(_T("%d"), m_BP->line) << _T('"');
+ m_Cmd << out << _T(":") << wxString::Format(_T("%d"), m_BP->line);
}
else if (m_BP->type == DebuggerBreakpoint::bptData)
{
This patch works under both the official gdb or the gdb-line-spec-branch.
For
break "filename":line
It should also be quite easy to implement. :)
To my point: I think mostly quote is not needed. (I exclude the case that file name does not contain spaces :), I'm not sure gdb support this)
The quote was added because some people have their projects inside paths containing "code::blocks" and this is regarded as method/function specification.
Quote from: oBFusCATed on March 26, 2012, 01:40:16 PM
The quote was added because some people have their projects inside paths containing "code::blocks" and this is regarded as method/function specification.
Ok, thanks, here is the new test from command line(under c::b debugger plugin)
[debug]> break "E:/code/cb/test_code/DebugDLLTest/TestDLL/dllmain1.cpp":29
[debug]No source file named E:/code/cb/test_code/DebugDLLTest/TestDLL/dllmain1.cpp.
[debug]Breakpoint 6 ("E:/code/cb/test_code/DebugDLLTest/TestDLL/dllmain1.cpp":29) pending.
[debug]>>>>>>cb_gdb:
No source file named E:/code/cb/test_code/DebugDLLTest/TestDLL/dllmain1.cpp.
Breakpoint 6 ("E:/code/cb/test_code/DebugDLLTest/TestDLL/dllmain1.cpp":29) pending.
> break "E:/code/cb/test_code/DebugDLLTest/TestDLL/dllmain.cpp":35
[debug]> break "E:/code/cb/test_code/DebugDLLTest/TestDLL/dllmain.cpp":35
[debug]Breakpoint 7 at 0x684c1814: file E:\code\cb\test_code\DebugDLLTest\TestDLL\dllmain.cpp, line 35.
[debug]>>>>>>cb_gdb:
Breakpoint 7 at 0x684c1814: file E:\code\cb\test_code\DebugDLLTest\TestDLL\dllmain.cpp, line 35.
So, I'm now trying to adjust the reg. :)
Quote from: ollydbg on March 26, 2012, 01:50:01 PM
So, I'm now trying to adjust the reg. :)
Good luck...
Quote from: oBFusCATed on March 26, 2012, 02:08:00 PM
Quote from: ollydbg on March 26, 2012, 01:50:01 PM
So, I'm now trying to adjust the reg. :)
Good luck...
Thanks, Done. Here is the new regular expression and patch:
Index: E:/code/cb/cb_debugger_branch/src/plugins/debuggergdb/gdb_commands.h
===================================================================
--- E:/code/cb/cb_debugger_branch/src/plugins/debuggergdb/gdb_commands.h (revision 7909)
+++ E:/code/cb/cb_debugger_branch/src/plugins/debuggergdb/gdb_commands.h (working copy)
@@ -131,7 +131,7 @@
// Breakpoint 1 at 0x4013d6: file main.cpp, line 8.
static wxRegEx reBreakpoint(_T("Breakpoint ([0-9]+) at (0x[0-9A-Fa-f]+)"));
// Breakpoint 1 ("/home/jens/codeblocks-build/codeblocks-1.0svn/src/plugins/debuggergdb/gdb_commands.h:125) pending.
-static wxRegEx rePendingBreakpoint(_T("Breakpoint ([0-9]+)[ \t]\\(\\\"(.+):([0-9]+)\\)[ \t]pending\\."));
+static wxRegEx rePendingBreakpoint(_T("Breakpoint ([0-9]+)[ \t]\\(\\\"(.+)\\\":([0-9]+)\\)[ \t]pending\\."));
// Hardware assisted breakpoint 1 at 0x4013d6: file main.cpp, line 8.
static wxRegEx reHWBreakpoint(_T("Hardware assisted breakpoint ([0-9]+) at (0x[0-9A-Fa-f]+)"));
// Hardware watchpoint 1: expr
@@ -448,7 +448,7 @@
m_Cmd << _T("break ");
else
m_Cmd << _T("tbreak ");
- m_Cmd << _T('"') << out << _T(":") << wxString::Format(_T("%d"), m_BP->line) << _T('"');
+ m_Cmd << _T('"') << out << _T("\":") << wxString::Format(_T("%d"), m_BP->line);
}
else if (m_BP->type == DebuggerBreakpoint::bptData)
{
FYI:
The command:
break "filename:line"
is reserved for compatibility.
In the future, the gdb bp pending response will have quote balance.
See:Re: [RFA 1/2] Linespec rewrite (update 2) (http://sourceware.org/ml/gdb-patches/2012-03/msg00899.html)
Again. The new linespec feature is now in GDB CVS HEAD, which means it will be official in GDB 7.5 (It also support using filename with spaces). I think we need to adjust the regex a little to support the new pattern and also keep the old GDB compatible. This should be easy. :)
Quote from: ollydbg on April 06, 2012, 02:13:35 AM
This should be easy. :)
Are you sure? I doubt pretty much.
But anyway patches welcome, but you have to test them a lot. Path with space, path with ::, linux, windows, etc...
I have build gdb cvs 2012-04-07, I use PCX's gcc 4.6.3.
also I change the break command send from c::b to
break "filename":line
I have a cbp project which I put in a folder name contains spaces, You can see the debug log:
Quote
Starting debugger: E:\code\gcc\myPCXMinGW463\bin\gdb.exe -nx -fullname -quiet -args E:/code/cb/TEST_C~1/SPACEF~1/hi/bin/Debug/hi.exe
done
[debug]> set prompt >>>>>>cb_gdb:
[debug]Skip initializing the scripting!
Setting breakpoints
[debug]Reading symbols from E:\code\cb\TEST_C~1\SPACEF~1\hi\bin\Debug\hi.exe...done.
[debug](gdb) >>>>>>cb_gdb:
[debug]> show version
[debug]GNU gdb (GDB) 7.4.50.20120407-cvs
[debug]Copyright (C) 2012 Free Software Foundation, Inc.
[debug]License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
[debug]This is free software: you are free to change and redistribute it.
[debug]There is NO WARRANTY, to the extent permitted by law. Type "show copying"
[debug]and "show warranty" for details.
[debug]This GDB was configured as "mingw32".
[debug]For bug reporting instructions, please see:
[debug]<http://www.gnu.org/software/gdb/bugs/>.
[debug]>>>>>>cb_gdb:
[debug]> set confirm off
Debugger name and version: GNU gdb (GDB) 7.4.50.20120407-cvs
[debug]>>>>>>cb_gdb:
[debug]> set width 0
[debug]>>>>>>cb_gdb:
[debug]> set height 0
[debug]>>>>>>cb_gdb:
[debug]> set breakpoint pending on
[debug]>>>>>>cb_gdb:
[debug]> set print asm-demangle on
[debug]>>>>>>cb_gdb:
[debug]> set unwindonsignal on
[debug]>>>>>>cb_gdb:
[debug]> set print elements 0
[debug]>>>>>>cb_gdb:
[debug]> set debugevents on
[debug]>>>>>>cb_gdb:
[debug]> set new-console on
[debug]>>>>>>cb_gdb:
[debug]> set disassembly-flavor att
[debug]>>>>>>cb_gdb:
[debug]> catch throw
[debug]Catchpoint 1 (throw)
[debug]>>>>>>cb_gdb:
[debug]> source E:\code\gcc\myPCXMinGW463\bin\my.gdb
[debug]>>>>>>cb_gdb:>>>>>>cb_gdb:
[debug]> directory E:/code/cb/TEST_C~1/SPACEF~1/hi/
[debug]Source directories searched: E:/code/cb/TEST_C~1/SPACEF~1/hi;$cdir;$cwd
[debug]>>>>>>cb_gdb:
[debug]> break "E:/code/cb/test_code/space folder/hi/main.cpp":7
[debug]Breakpoint 2 at 0x4013de: file E:\code\cb\test_code\space folder\hi\main.cpp, line 7.
[debug]>>>>>>cb_gdb:
[debug]> run
[debug]Starting program: E:\code\cb\TEST_C~1\SPACEF~1\hi\bin\Debug\hi.exe
[debug]gdb: windows_init_thread_list
Child process PID: 3796
[debug][New Thread 3796.0x2e4]
[debug]Breakpoint 2, main () at E:\code\cb\test_code\space folder\hi\main.cpp:7
[debug]E:\code\cb\test_code\space folder\hi\main.cpp:7:62:beg:0x4013de
[debug]>>>>>>cb_gdb:
At E:\code\cb\test_code\space folder\hi\main.cpp:7
[debug]> set debugevents off
[debug]>>>>>>cb_gdb:
[debug]> next
[debug]E:\code\cb\test_code\space folder\hi\main.cpp:8:99:beg:0x401402
[debug]>>>>>>cb_gdb:
You can see, the breakpoint hit correctly, and next command also works OK.
PS: I have not quite familiar with Linux, so I can only test under Windows.
What about gdb7.4 (non-cvs) and gdb7.3/2/1 or 6.8 (don't care too much btw)?
First Patch:
https://developer.berlios.de/patch/?func=detailpatch&patch_id=3274&group_id=5358
This will let C::B support gdb(cvs, 7.5), and preserve the old gdb ( gdb7.4-gdb6.8 ) compatibility.
See my explanation in gdb maillist:
http://sourceware.org/ml/gdb-patches/2012-03/msg00899.html
Please add a line which demonstrates what kind of lines matches the new regex, because I'm not really sure.
Also your patch doesn't change the setting of breakpoints, why?
p.s. I guess you wanted to use preserve instead of deserve?
Quote from: oBFusCATed on April 08, 2012, 10:02:31 AM
Please add a line which demonstrates what kind of lines matches the new regex, because I'm not really sure.
Here is what gdb7.4-gdb6.8 returned:
[debug]> break "E:/code/cb/cb_trunk/src/plugins/codecompletion/parser/token.cpp:64"
[debug]No source file named E:/code/cb/cb_trunk/src/plugins/codecompletion/parser/token.cpp.
[debug]Breakpoint 2 ("E:/code/cb/cb_trunk/src/plugins/codecompletion/parser/token.cpp:64) pending.
Here is gdb cvs(7.5) returned:
[debug]> break "E:/code/cb/test_code/DebugDLLTest/TestDLL/dllmain.cpp:29"
[debug]No source file named E:/code/cb/test_code/DebugDLLTest/TestDLL/dllmain.cpp.
[debug]Breakpoint 4 ("E:/code/cb/test_code/DebugDLLTest/TestDLL/dllmain.cpp:29") pending.
You see, the gdb cvs has a quote before right-parenthesis, but gdb7.4-gdb6.8 does not.
QuoteAlso your patch doesn't change the setting of breakpoints, why?
I don't think the old gdb( 7.4-6.8 ) will works under command like
break "filename":line
So, I don't change the bp command send from c::b.
Quote
p.s. I guess you wanted to use preserve instead of deserve?
Thanks, It should be "preserve". (My English is not quite good :))
Quote from: ollydbg on April 08, 2012, 10:54:51 AM
[debug]Breakpoint 4 ("E:/code/cb/test_code/DebugDLLTest/TestDLL/dllmain.cpp:29") pending.
Put this line in the patch as a comment and commit it.
Also this line: "Breakpoint ([0-9]+)[ \\t]\\(\\\"(.+):([0-9]+)(\"?)\\)[ \\t]pending\\." looks a bit better to me.
Quote from: oBFusCATed on April 08, 2012, 11:06:29 AM
Quote from: ollydbg on April 08, 2012, 10:54:51 AM
[debug]Breakpoint 4 ("E:/code/cb/test_code/DebugDLLTest/TestDLL/dllmain.cpp:29") pending.
Put this line in the patch as a comment and commit it.
Also this line: "Breakpoint ([0-9]+)[ \\t]\\(\\\"(.+):([0-9]+)(\"?)\\)[ \\t]pending\\." looks a bit better to me.
OK, I will refine my patch and commit it, thanks fore the review.
@OBF:
Do you think that all
\\\"
should be turned to
\"
You can see there is one instance before the position I changed.
I'm not really sure about the number of \ in this. This is a copy paste from the second line in the regex testbed plugin.
The thing I want in there is (\"?), so it is clear that the " is optional.
Quote from: oBFusCATed on April 08, 2012, 11:22:35 AM
I'm not really sure about the number of \ in this. This is a copy paste from the second line in the regex testbed plugin.
The thing I want in there is (\"?), so it is clear that the " is optional.
I did further test, and I can confirm that
\\\" can be replaced by
\", everything works OK.
This is because
" is
not a special character in regular expression.
I will commit the patch below if there is no objections in a few days.
Index: E:/code/cb/cb_trunk/src/plugins/debuggergdb/gdb_commands.h
===================================================================
--- E:/code/cb/cb_trunk/src/plugins/debuggergdb/gdb_commands.h (revision 7925)
+++ E:/code/cb/cb_trunk/src/plugins/debuggergdb/gdb_commands.h (working copy)
@@ -130,8 +130,11 @@
static wxRegEx reBT4(_T("#([0-9]+)[ \\t]+(.+)[ \\t]in[ \\t](.+)")); // case #11
// Breakpoint 1 at 0x4013d6: file main.cpp, line 8.
static wxRegEx reBreakpoint(_T("Breakpoint ([0-9]+) at (0x[0-9A-Fa-f]+)"));
+// GDB7.4 and before will return:
// Breakpoint 1 ("/home/jens/codeblocks-build/codeblocks-1.0svn/src/plugins/debuggergdb/gdb_commands.h:125) pending.
-static wxRegEx rePendingBreakpoint(_T("Breakpoint ([0-9]+)[ \t]\\(\\\"(.+):([0-9]+)\\)[ \t]pending\\."));
+// GDB7.5 and later will return:
+// Breakpoint 4 ("E:/code/cb/test_code/DebugDLLTest/TestDLL/dllmain.cpp:29") pending.
+static wxRegEx rePendingBreakpoint(_T("Breakpoint ([0-9]+)[ \t]\\(\"(.+):([0-9]+)(\"?)\\)[ \t]pending\\."));
// Hardware assisted breakpoint 1 at 0x4013d6: file main.cpp, line 8.
static wxRegEx reHWBreakpoint(_T("Hardware assisted breakpoint ([0-9]+) at (0x[0-9A-Fa-f]+)"));
// Hardware watchpoint 1: expr
Go on...