Difference between revisions of "Pretty Printers"

From Code::Blocks
m
Line 32: Line 32:
 
<ol><span style="font-size: 10pt"><pre>source $(TARGET_COMPILER_DIR)bin\pp.gdb</pre></span></ol>
 
<ol><span style="font-size: 10pt"><pre>source $(TARGET_COMPILER_DIR)bin\pp.gdb</pre></span></ol>
 
<ol start="2">
 
<ol start="2">
<li>Comment out the Codeblocks gdb handler:</li>
+
<li>Disable Codeblocks handling of watch values:</li>
 
</ol>
 
</ol>
<ol>Edit the file (path to Codeblocks)\share\CodeBlocks\scripts\gdb_types.script</ol>
+
<ol><span style="font-size: 10pt"><tt>Codeblocks->Settings->Debugger->Default->Enable Watch Scripts = Unchecked</tt></span></ol>
<ol>Add comments as follows:</ol>
 
<ol><span style="font-size: 10pt"><pre>
 
   /* STL String
 
   driver.RegisterType(
 
       _T("STL String"),
 
       _T("[^[:alnum:]_]*string[^[:alnum:]_]*"),
 
       _T("Evaluate_StlString"),
 
       _T("Parse_StlString")
 
   );*/
 
 
 
   /* STL Vector
 
   driver.RegisterType(
 
       _T("STL Vector"),
 
       _T("[^[:alnum:]_]*vector<.*"),
 
       _T("Evaluate_StlVector"),
 
       _T("Parse_StlVector")
 
   ); */
 
</pre></span></ol>
 
 
===Other Info===
 
===Other Info===
 
Links:
 
Links:

Revision as of 00:48, 26 October 2012

GDB Pretty Printers for STL output nicely formatted variables, even for vectors and maps. This works in GDB, and if enabled, in the hover pop-up and watch window in Codeblocks.


Popup example

Test with GDB

  • Install a python-enabled GDB. For Windows, you can install MinGW-Builds over MinGW (consider backing up MinGW first). This updates GCC to 4.7.2 and includes a Python enabled GDB.
  • Create a GDB Command File to enable the printer. Store in c:\mingw\bin\pp.gdb (or wherever you want). Below is a sample command file. Replace the path c:/MinGW/share... with your path to printers.py. NOTE: A Python STL printer.py is included with MinGW and MinGW-Builds, so there is no need to download one. It only needs to be loaded into GDB's python, which is the purpose of the command file
python
import os, sys
lib_path = os.path.abspath('c:/MinGW/share/gcc-4.7.2/python/libstdcxx/v6')
sys.path.append(lib_path)
#print 'path is [%s]' % ', '.join(map(str, sys.path))
from printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
  • Test
  1. Set a breakpoint in a program and debug
  2. Run the GDB command file (can use Codeblocks debugger tab command, or GDB from console) (substitute your path if necessary)
    (gdb) source c:\MinGW\bin\pp.gdb
  1. Test the printer - example:
    (gdb) print words2
    $1 = std::vector of length 3, capacity 4 = {"one", "two", "three"}
    

Add to Codeblocks

Once the command file is correctly loading the python printer into GDB, there are two steps to activate in Codeblocks:

  1. Set debugger initialization command:
    Codeblocks->Settings->Debugger->Default->Debugger initialization commands
    source $(TARGET_COMPILER_DIR)bin\pp.gdb
  1. Disable Codeblocks handling of watch values:
    Codeblocks->Settings->Debugger->Default->Enable Watch Scripts = Unchecked

Other Info

Links:

GDB Python API

GDB Pretty Printing

To Do

The third column in the Codeblocks popup and watch window displays a long unformatted string. Codeblocks is calling the GDB whatis command. Can this command be Pretty-Printed?