News:

As usual while waiting for the next release - don't forget to check the nightly builds in the forum.

Main Menu

The output infomation of std:bitset is insufficient when debugging.

Started by hooluupog, March 31, 2012, 06:43:03 AM

Previous topic - Next topic

hooluupog

I added a bitset type of virable to watch When debugging but the output infomation is  insufficient and not intuitive.
For example,somthing like this:
{
...
std::bitset<26> dictionary;  
...
}
F8 start debugging it and add 'dictionary' to watch, the output is:

-dictionary
 -<std::_Base_Bitset<1u>>
    -M_w=8736     (when changed to binary,it shows: 10001000100000)
 -<No data fields>

It can not show the detailed contents of bitset for me to debug it.Then let's look at the result in visual studio 2008 debugger window:
watch1
name
dictionary
0
1
2
3
4
...
value
[26]{0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0.......}
false
false
true
true
false
...
type
std::bitset<26>
bool
bool
bool
bool
bool
...

It's intuitive and offers enough useful information for developers.  Eclipse+cdt and codelite also have the same result with codeblocks.  Then i installed wingdb (an application to use mingw/cygwin+gdb in visual studio) and tried visual studio again.This time it shows the same result with codeblocks. Is it gdb's fault?  
I selected visual studio 2005/2008 compiler and cdb debugger in codeblocks to debug again,it still can not shows detailed contents.The result is:

dictionary = class std::bitset<26>
  ---_Array           =[1]0x40f227

Now i am confused and not sure what is the culprit. Why codeblocks fails to show  the detailed contents of bitset as visual studio does? ???

ollydbg

Quote from: hooluupog on March 31, 2012, 06:43:03 AM
It's intuitive and offers enough useful information for developers.  Eclipse+cdt and codelite also have the same result with codeblocks.  Then i installed wingdb (an application to use mingw/cygwin+gdb in visual studio) and tried visual studio again.This time it shows the same result with codeblocks. Is it gdb's fault?
You can run your debug session in the command line, and see whether gdb print right result.

Here, it works OK, mingw4.6.3 + gdb cvs + codeblocks debugger branch nightly build.
The sample code:

// bitset::test
#include <iostream>
#include <string>
#include <bitset>
using namespace std;

int main ()
{
  bitset<5> mybits (string("01011"));
  cout << "mybits contains:\n";
  cout << boolalpha;
  for (size_t i=0; i<mybits.size(); ++i)
    cout << mybits.test(i) << endl;

  return 0;
}


The result screen shot:


Quote
I selected visual studio 2005/2008 compiler and cdb debugger in codeblocks to debug again,it still can not shows detailed contents.The result is:

dictionary = class std::bitset<26>
  ---_Array           =[1]0x40f227

Now i am confused and not sure what is the culprit. Why codeblocks fails to show  the detailed contents of bitset as visual studio does? ???
Code::blocks' debugger have better support on gdb than cdb, can you help to elaborate?
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Jenna

Quote from: ollydbg on March 31, 2012, 08:52:49 AM
Here, it works OK, mingw4.6.3 + gdb cvs + codeblocks debugger branch nightly build.

It does not work with default installation.
I guess you need pretty printers to make it work.

hooluupog

Quote from: ollydbg on March 31, 2012, 08:52:49 AM
The result screen shot:

Hi,
it is strange. I am using 7790 debugger branch with latest version tdm-gcc. Here is my result:
click to zoom it.

oBFusCATed

hooluupog: Works for me, like in the screenshot from Ollydbg, but you need to install python enabled gdb and you need to have python pretty printers for gdb for the stl library.
See here: http://sourceware.org/gdb/wiki/STLSupport

p.s. Keep in mind that attaching images to the forum is not a really good idea, because the space is limited an when it is exhausted the admins delete attachments at random. A better idea is to paste as text (right click in the command line and mark) or use an image sharing service!
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

hooluupog

Quote from: oBFusCATed on March 31, 2012, 10:15:41 AM
hooluupog: Works for me, like in the screenshot from Ollydbg, but you need to install python enabled gdb and you need to have python pretty printers for gdb for the stl library.
See here: http://sourceware.org/gdb/wiki/STLSupport

p.s. Keep in mind that attaching images to the forum is not a really good idea, because the space is limited an when it is exhausted the admins delete attachments at random. A better idea is to paste as text (right click in the command line and mark) or use an image sharing service!
Thanks for clearing up my doubt. :) IMHO, it will be good to integrate pretty printers with codeblocks.

oBFusCATed

Why? Newer gccs have them integrated in the libstdc++ lib, although I don't know what is shipped with Mingw, but this is not our job, it is the job of Mingw developers to ship the printers with they stdc++ lib.
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

ollydbg

Quote from: oBFusCATed on March 31, 2012, 11:49:24 AM
Why? Newer gccs have them integrated in the libstdc++ lib, although I don't know what is shipped with Mingw, but this is not our job, it is the job of Mingw developers to ship the printers with they stdc++ lib.
I see both PCX and TDM's GCC 4.6.x have shipped python pretty printers for libstdc++. They are under
MinGWFolder/share/gcc4.6.x/python/libstdcxx
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

hooluupog

You are right ;D. Tdm-gcc has already had pretty-printers in it. Use gdb-python27.exe instead of gdb.exe in codeblocks debugger settings and it finally recognized the stl containers correctly.

killerbot


killerbot

just did simple test on debugger branch on linux ==> no pretty printing,

bits  --> std:;_Base_bitset , which can further expand to [1] ==> which says : no data fields.

EDIT : didn't we source in the past on linux some pretty printing scrips ? do we still do that ?

oBFusCATed

If you have python enabled gdb and gcc>=4.5 you should have the printers enabled by default.

Currently we have an option to disable the printer scripts in C::B, which should be enabled, so C::B would use normal print commands.
The old scripts are used, but they are no good enough, the pretty printers are way better, but parsing std::vector<std::vector>> is
not working correctly, nor any other nested structure. Unfortunately this could not be made to work.
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

killerbot

GNU gdb (GDB) SUSE (7.4.50.20120120-78.3)
gcc (SUSE Linux) 4.6.2


so those should meet the criteria.

Maybe it is disabled in CB ? Where could it be disabled, at first glance I don't find anything.

oBFusCATed

(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

killerbot

running 'info pretty-printer' in CB


info pretty-printer
  objfile /usr/lib64/libstdc++.so.6 pretty-printers:
  libstdc++-v6
    __gnu_cxx::_Slist_iterator
    __gnu_cxx::__7::_Slist_iterator
    __gnu_cxx::__7::__normal_iterator
    __gnu_cxx::__7::slist
    __gnu_cxx::__normal_iterator
    __gnu_cxx::slist
    __gnu_debug::_Safe_iterator
    std::_Deque_const_iterator
    std::_Deque_iterator
    std::_List_const_iterator
    std::_List_iterator
    std::_Rb_tree_const_iterator
    std::_Rb_tree_iterator
    std::__7::_Deque_const_iterator
    std::__7::_Deque_iterator
    std::__7::_List_const_iterator
    std::__7::_List_iterator
    std::__7::_Rb_tree_const_iterator
    std::__7::_Rb_tree_iterator
    std::__7::basic_string
    std::__7::bitset
    std::__7::deque
    std::__7::forward_list
    std::__7::list
    std::__7::map
    std::__7::multimap
    std::__7::multiset
    std::__7::priority_queue
    std::__7::queue
    std::__7::set
    std::__7::shared_ptr
    std::__7::stack
    std::__7::tuple
    std::__7::unique_ptr
    std::__7::unordered_map
    std::__7::unordered_multimap
    std::__7::unordered_multiset
    std::__7::unordered_set
    std::__7::vector
    std::__7::weak_ptr
    std::__cxx1998::_Deque_const_iterator
    std::__cxx1998::_Deque_iterator
    std::__cxx1998::_List_const_iterator
    std::__cxx1998::_List_iterator
    std::__cxx1998::__7::_Deque_const_iterator
    std::__cxx1998::__7::_Deque_iterator
    std::__cxx1998::__7::_List_const_iterator
    std::__cxx1998::__7::_List_iterator
    std::__cxx1998::__7::bitset
    std::__cxx1998::__7::deque
    std::__cxx1998::__7::forward_list
    std::__cxx1998::__7::list
    std::__cxx1998::__7::map
    std::__cxx1998::__7::multimap
    std::__cxx1998::__7::multiset
    std::__cxx1998::__7::set
    std::__cxx1998::__7::unordered_map
    std::__cxx1998::__7::unordered_multimap
    std::__cxx1998::__7::unordered_multiset
    std::__cxx1998::__7::unordered_set
    std::__cxx1998::__7::vector
    std::__cxx1998::bitset
    std::__cxx1998::deque
    std::__cxx1998::forward_list
    std::__cxx1998::list
    std::__cxx1998::map
    std::__cxx1998::multimap
    std::__cxx1998::multiset
    std::__cxx1998::set
    std::__cxx1998::unordered_map
    std::__cxx1998::unordered_multimap
    std::__cxx1998::unordered_multiset
    std::__cxx1998::unordered_set
    std::__cxx1998::vector
    std::__debug::bitset
    std::__debug::deque
    std::__debug::forward_list
    std::__debug::list
    std::__debug::map
    std::__debug::multimap
    std::__debug::multiset
    std::__debug::priority_queue
    std::__debug::queue
    std::__debug::set
    std::__debug::stack
    std::__debug::unique_ptr
    std::__debug::unordered_map
    std::__debug::unordered_multimap
    std::__debug::unordered_multiset
    std::__debug::unordered_set
    std::__debug::vector
    std::__norm::_Deque_const_iterator
    std::__norm::_Deque_iterator
    std::__norm::_List_const_iterator
    std::__norm::_List_iterator
    std::basic_string
    std::bitset
    std::deque
    std::forward_list
    std::list
    std::map
    std::multimap
    std::multiset
    std::priority_queue
    std::queue
    std::set
    std::shared_ptr
    std::stack
    std::tr1::__7::shared_ptr
    std::tr1::__7::unordered_map
    std::tr1::__7::unordered_multimap
    std::tr1::__7::unordered_multiset
    std::tr1::__7::unordered_set
    std::tr1::__7::weak_ptr
    std::tr1::shared_ptr
    std::tr1::unordered_map
    std::tr1::unordered_multimap
    std::tr1::unordered_multiset
    std::tr1::unordered_set
    std::tr1::weak_ptr
    std::tuple
    std::unique_ptr
    std::unordered_map
    std::unordered_multimap
    std::unordered_multiset
    std::unordered_set
    std::vector
    std::weak_ptr


when running gdb from shell (no application specified) : info pretty-printer  ==> nothing