Archive for November 14th, 2005

Importing debug information into dbx

Monday, November 14th, 2005

I’m sure I wrote this up somewhere before, but now I can’t find it. Just in case you guys (my two faithful readers) haven’t seen this trick yet. If you are stuck with a core file that doesn’t have debug information, you can “import” debugging information using the “loadobject -load” command. It’s especially useful for C++ to help get rid of the mangled names that show up in stack traces.

% #########################
% more t.c

#include "t.h"

struct foo foofoo;

int
main()
{
    foofoo.a = 1;
    foofoo.b = 2;
    * (int *) 0 = 0;
}

% #########################
% more t.h

struct foo {
int a;
int b;
};

% #########################
% cc -o t t.c # no debug info

% #########################
% ./t
Segmentation Fault (core dumped)

% #########################
% dbx t core
Reading t
core file header read successfully
Reading ld.so.1
Reading libc.so.1
Reading libdl.so.1
Reading libc_psr.so.1
program terminated by signal SEGV (no mapping at the fault address)
0x00010bb4: main+0x001c:   clr      [0]
(dbx) whatis foofoo
dbx: warning: unknown language, 'c' assumed
(int {assumed}) foofoo;
(dbx) print foofoo
foofoo = 0x1
(dbx) whatis -t foo
dbx: "foo" is not defined in the scope `t`main`
dbx: see `help scope' for details
(dbx) quit

% # 
% #  You really want to see the contents of the 'foofoo'
% #  structure, but the binary doesn't have debug info!
% #  So create a dummy .so file with debug info, and load
% #  that into dbx manually.
% # 

% #########################
% more dummy.c

#include "t.h"

% #########################
% cc -G -g -o dummy.so dummy.c

% #########################
% dbx t core
Reading t
core file header read successfully
Reading ld.so.1
Reading libc.so.1
Reading libdl.so.1
Reading libc_psr.so.1
program terminated by signal SEGV (no mapping at the fault address)
0x00010bb4: main+0x001c:   clr      [0]
(dbx) loadobject -load dummy.so
Reading dummy.so
Loaded loadobject: /set/dbx/somewhere/misc/coretest/dummy.so
(dbx) modules | grep dummy
Not Read  dummy.o
(dbx) module dummy.o
Read      dummy.o
(dbx) whatis -t foo
struct foo {
    int a;
    int b;
};
(dbx) print *(struct foo*)&foofoo
dbx: warning: unknown language, 'c' assumed
*((struct foo *) &foofoo) = {
    a = 0x1
    b = 0x2
}