Code::Blocks Forums

User forums => Help => Topic started by: Sab on May 16, 2015, 01:20:45 pm

Title: Pretty Printers working only for global variables
Post by: Sab on May 16, 2015, 01:20:45 pm
Windows 7-64 bit
C::B 13.12
gdb 7.7
g++ 4.9.2

For me if I use vector as a local variable, not able to see value of vectors during debugging but if I declare vector as global variable pretty printers are working. Same is happening for std::strings.
And when I tried std::queue, std::map pretty printers are not working. I have attached screenshots of configuration and debugging window.

How can I view other STL containers?
Title: Re: Pretty Printers working only for global variables
Post by: ollydbg on May 16, 2015, 02:37:32 pm
I don't have such issue.
One suggestion: you need to uncheck the "Enable watch scripts" option.
Title: Re: Pretty Printers working only for global variables
Post by: Sab on May 16, 2015, 05:05:03 pm
I uncheck the "Enable watch scripts" option and the pretty printers are not working then I noticed the
Code
Error while executing Python code.
, googled and tried the following.


My stl.gdb
Code
python
import sys
sys.path.insert(0, '')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

I am getting following error while executing while debugging in Code Block

Code
source C:\MinGW\bin\stl.gdb
Traceback (most recent call last):
  File "<string>", line 3, in <module>
ImportError: No module named libstdcxx.v6.printers
C:\MinGW\bin\stl.gdb:5: Error in sourced command file:
Error while executing Python code.

and following error from command prompt

Code
(gdb) source C:\MinGW\bin\stl.gdb
Traceback (most recent call last):
  File "<string>", line 4, in <module>
  File "c:\mingw\share\gdb/python/../../gcc-4.9.2/python/libstdcxx/v6/printers.p
y", line 1023, in register_libstdcxx_printers
    gdb.printing.register_pretty_printer(obj, libstdcxx_printer)
  File "c:\mingw\share\gdb/python/gdb/printing.py", line 146, in register_pretty
_printer
    printer.name)
RuntimeError: pretty-printer already registered: libstdc++-v6
C:\MinGW\bin\stl.gdb:6: Error in sourced command file:
Error while executing Python code.
(gdb)

then I removed
Code
register_libstdcxx_printers (None)
from my stl.gdb and I didn't get any error in command prompt but getting same error in code block

What should I do?

Edit:My gdb version 7.8.1

I tried to debug in command line:
Code
Breakpoint 1, main ()
    at D:\Program\Practice Program\PrettyPrinterCheck\main.cpp:41
41          cout<<s;
(gdb) print p
$1 = {first = 13, second = 14}
(gdb) print m
$2 = std::map with 1 elements = {[2] = 1}
(gdb) print v
$3 = std::vector of length 1, capacity 1 = {10}
(gdb) print q
$4 = std::queue wrapping: std::deque with 2 elements = {10, 11}
(gdb) print s
$5 = "Hello"
Title: Re: Pretty Printers working only for global variables
Post by: ollydbg on May 17, 2015, 07:43:49 am
Code
(gdb) source C:\MinGW\bin\stl.gdb
Traceback (most recent call last):
  File "<string>", line 4, in <module>
  File "c:\mingw\share\gdb/python/../../gcc-4.9.2/python/libstdcxx/v6/printers.p
y", line 1023, in register_libstdcxx_printers
    gdb.printing.register_pretty_printer(obj, libstdcxx_printer)
  File "c:\mingw\share\gdb/python/gdb/printing.py", line 146, in register_pretty
_printer
    printer.name)
RuntimeError: pretty-printer already registered: libstdc++-v6
C:\MinGW\bin\stl.gdb:6: Error in sourced command file:
Error while executing Python code.
(gdb)

then I removed
Code
register_libstdcxx_printers (None)
from my stl.gdb and I didn't get any error in command prompt
Yes, you should remove that line, because the std pretty printer is registered when it is imported, see my answer here:
http://stackoverflow.com/a/28404772/154911

Quote
but getting same error in code block

What should I do?

Edit:My gdb version 7.8.1

I tried to debug in command line:
Code
Breakpoint 1, main ()
    at D:\Program\Practice Program\PrettyPrinterCheck\main.cpp:41
41          cout<<s;
(gdb) print p
$1 = {first = 13, second = 14}
(gdb) print m
$2 = std::map with 1 elements = {[2] = 1}
(gdb) print v
$3 = std::vector of length 1, capacity 1 = {10}
(gdb) print q
$4 = std::queue wrapping: std::deque with 2 elements = {10, 11}
(gdb) print s
$5 = "Hello"
From the command line, I see it works OK, but you should get the same result in C::B, I have no idea, do you have two different version of GDBs in your system?
Title: Re: Pretty Printers working only for global variables
Post by: Sab on May 17, 2015, 01:35:44 pm
I have only one GDB. I have attached my settings->compiler->toolchain config.

my current stl.gdb file

Code
python
import sys
sys.path.insert(0, 'C:\MinGW\share\gcc-4.9.2\python')
from libstdcxx.v6.printers import register_libstdcxx_printers
end

after this I am not getting any error in C::B debugger prompt but still pretty printers are not working in C:B while in command prompt it is  working.
Title: Re: Pretty Printers working only for global variables
Post by: oBFusCATed on May 17, 2015, 03:05:46 pm
One way to check if gdb's pretty printers are working is to stop at a breakpoint, switch to the debugger's log and execute the "info pretty-printer" command. It should list your pretty printers that are currently active. Also another command you can try is "print myVector" to see the raw output of gdb.
Title: Re: Pretty Printers working only for global variables
Post by: ollydbg on May 17, 2015, 03:15:04 pm
I have only one GDB. I have attached my settings->compiler->toolchain config.

my current stl.gdb file

Code
python
import sys
sys.path.insert(0, 'C:\MinGW\share\gcc-4.9.2\python')
from libstdcxx.v6.printers import register_libstdcxx_printers
end

after this I am not getting any error in C::B debugger prompt but still pretty printers are not working in C:B while in command prompt it is  working.
I want to see the "full debugger log" when the problem you mentioned in the first post happens. I mean the log message when you have problems in shown in yy.png.
Title: Re: Pretty Printers working only for global variables
Post by: Sab on May 18, 2015, 01:59:32 pm
I want to see the "full debugger log" when the problem you mentioned in the first post happens. I mean the log message when you have problems in shown in yy.png.

I have attached the files debugger-first.txt is the first one and debugger-now.txt is the current one.

first config : as present in the first post screenshots and stl.gdb:

Code
python
import sys
sys.path.insert(0, '')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

path to stl.gdb - C:\MinGW\bin\stl.gdb

sorry for the bad attachment name in my first post.

I tried re-installing code :: block still no use. MinGW I currently have - x86_64-4.9.2-release-posix-seh-rt_v4-rev2


Title: Re: Pretty Printers working only for global variables
Post by: ollydbg on May 18, 2015, 03:31:04 pm
Hi, Sab.
I looked the two txt files.
debuglog-now.txt looks correct, and debuglog-first.txt is wrong. Because I see
Code
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
which means you did not turn off the watch script in debuglog-first.txt.

But I don't see the variables like "m, v, q, s" in the debuglog-now.txt, so what is the problem right now?
Title: Re: Pretty Printers working only for global variables
Post by: Sab on May 18, 2015, 03:47:45 pm
Sorry, I thought u wanted the gdb starting log, I have attached the one with print command
Title: Re: Pretty Printers working only for global variables
Post by: ollydbg on May 18, 2015, 04:00:40 pm
Code
[debug]> print q
[debug]$4 = {c = {<std::_Deque_base<int, std::allocator<int> >> = {_M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_map = 0x5427e0, _M_map_size = 8, _M_start = {_M_cur = 0x544d00, _M_first = 0x544d00, _M_last = 0x544f00, _M_node = 0x5427f8}, _M_finish = {_M_cur = 0x544d08, _M_first = 0x544d00, _M_last = 0x544f00, _M_node = 0x5427f8}}}, <No data fields>}}
[debug]>>>>>>cb_gdb:

$4 = {c = {<std::_Deque_base<int, std::allocator<int> >> = {_M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_map = 0x5427e0, _M_map_size = 8, _M_start = {_M_cur = 0x544d00, _M_first = 0x544d00, _M_last = 0x544f00, _M_node = 0x5427f8}, _M_finish = {_M_cur = 0x544d08, _M_first = 0x544d00, _M_last = 0x544f00, _M_node = 0x5427f8}}}, <No data fields>}}
> print m

[debug]> print m
[debug]$5 = {_M_t = {_M_impl = {<std::allocator<std::_Rb_tree_node<std::pair<int const, int> > >> = {<__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<int const, int> > >> = {<No data fields>}, <No data fields>}, _M_key_compare = {<std::binary_function<int, int, bool>> = {<No data fields>}, <No data fields>}, _M_header = {_M_color = std::_S_red, _M_parent = 0x544fc0, _M_left = 0x544fc0, _M_right = 0x544fc0}, _M_node_count = 1}}}
[debug]>>>>>>cb_gdb:

$5 = {_M_t = {_M_impl = {<std::allocator<std::_Rb_tree_node<std::pair<int const, int> > >> = {<__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<int const, int> > >> = {<No data fields>}, <No data fields>}, _M_key_compare = {<std::binary_function<int, int, bool>> = {<No data fields>}, <No data fields>}, _M_header = {_M_color = std::_S_red, _M_parent = 0x544fc0, _M_left = 0x544fc0, _M_right = 0x544fc0}, _M_node_count = 1}}}

It looks like pretty printer is not installed correctly. (But I do see you have
Code
[debug]> source C:\MinGW\bin\stl.gdb
In the log message.

What is the result when you type "info pretty-printer" in C::B's gdb debug panel?

Also, can you show the full log when you debug the same command in the windows command line.
Title: Re: Pretty Printers working only for global variables
Post by: Sab on May 18, 2015, 05:19:55 pm

What is the result when you type "info pretty-printer" in C::B's gdb debug panel?

Also, can you show the full log when you debug the same command in the windows command line.

Code
> info pretty-printer

[debug]> info pretty-printer
[debug]global pretty-printers:
[debug]  builtin
[debug]    mpx_bound128
[debug]>>>>>>cb_gdb:

global pretty-printers:
  builtin
    mpx_bound128


Now pretty printers are not working in cmd too.
Title: Re: Pretty Printers working only for global variables
Post by: ollydbg on May 19, 2015, 02:19:02 am

Code
> info pretty-printer

[debug]> info pretty-printer
[debug]global pretty-printers:
[debug]  builtin
[debug]    mpx_bound128
[debug]>>>>>>cb_gdb:

global pretty-printers:
  builtin
    mpx_bound128


Now pretty printers are not working in cmd too.
Interesting, so you could try to add the line "register_libstdcxx_printers (None)" back to stl.gdb file, and see whether it works again.
Title: Re: Pretty Printers working only for global variables
Post by: Sab on May 19, 2015, 06:24:02 am
Interesting, so you could try to add the line "register_libstdcxx_printers (None)" back to stl.gdb file, and see whether it works again.

Its working :o I have attached screenshot of watcher and debugger log.