CS255/455 Spring 2008 How to Debug your compiler

  • Build a debuggable compiler
    Usually if we want to debug a program, we need to turn off all compiler optimizations and add '-g' flag when building the program. To build a debuggable GCC, just configure it normally and then make STAGE1_CFLAGS='-g -O0' all-stage1. However, in our project, at most time we only need to debug our own code, which is supposed to be in a single file cs255.c. So you can just build and install the compiler normally. Then each time after you modify cs255.c, build the compiler with make BOOT_CFLAGS='-O0 -g3'. This will go through the bootstrap steps. To further save compile time, you can go to OBJ_DIR/gcc directory and run make CFLAGS='-O0 -g3'.

  • Underneath gcc
    Actually, gcc you called when you do compilation is just a driver for real compiler cc1, assembler as and linker collect2. Use option -v you can see the exact command sequence. For direct debugging you should run gdb cc1.

  • Write a gdb command file
    After getting the command sequence by using gcc -v, you can write a gdb command file to save the typing when starting gdb. Here is an example of such file (your file location and parameters may be different). Let's name this file as gdbfile, and then you can run gdb -x gdbfile to start debugging.
      file /localdisk/bao/gcc/obj/gcc/cc1
      b rest_of_handle_cs255
      r -quiet -v ab.c -quiet -dumpbase ab.c -mtune=generic -auxbase-strip ab.o -O2 -version -fcs255 -fdump-tree-gimple
        -fdump-cs255-tree-gimple -o /tmp/cceaerqF.s

  • Get familiar with gdb commands
    Refer to gdb documentation on how to set break points, print the current call stack, examine variable values, and so on.
    • break [file:]func_name to set a break point; break [filename:]linenum to set a break point at a line; break ... if cond to stop only when cond evaluates to true; info break to print all breakpoints.
    • backtrace or bt to print the current call stack; frame n or f n to select a stack frame.
    • print variable to view variable value.
    • watch to set watchpoints and disable, enble or delete these points.
    • You can modify variable values and call program functions within the debugger, making it a good test environment for trying your coding ideas.
    • Some other reference: Debugging with GDB by Stallman, Pesch, Shebs, et al.

  • Run gdb in Emacs
    A nice feature of running gdb in Emacs is it can link a gdb window and source code window together. Stepping in gdb will move the cursor on the source code window as well. A useful trick is to create a soft link to your cc1 on your test case directory, and then you don't need to change your working directory in gdb back and forth.
    • M-x gdb
    • gdb --annotate=3 cc1.
    • gdb has been started, so you can use it normally.

  1. gimple tree
  2. node

  • Dumping gimple-node


Edit | Attach | Watch | Print version | History: r8 | r6 < r5 < r4 < r3 | Backlinks | Raw View | Raw edit | More topic actions...
Topic revision: r4 - 2009-01-26 - BinBao
  • Edit
  • Attach
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2018 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding URCS? Send feedback