[Crash-utility] [PATCH]: gcore extension, anonymous union in inode struct

Dave Anderson anderson at redhat.com
Fri Sep 21 13:37:21 UTC 2012



----- Original Message -----
> Hi Daisuke,
> 
> 
> On Tue, Sep 18, 2012 at 8:19 AM, HATAYAMA Daisuke <
> d.hatayama at jp.fujitsu.com > wrote:
> 
> 
> From: Dave Anderson < anderson at redhat.com >
> Subject: Re: [Crash-utility] [PATCH]: gcore extension, anonymous
> union in inode struct
> Date: Tue, 11 Sep 2012 08:50:32 -0400
> 
> 
> 
> > 
> > 
> > ----- Original Message -----
> >> From: Per Fransson < per.fransson.ml at gmail.com >
> >> Subject: [Crash-utility] [PATCH]: gcore extension, anonymous union
> >> in
> >> inode struct
> >> Date: Wed, 5 Sep 2012 12:29:43 +0200
> >> 
> >> > Hi Crash people,
> >> > 
> >> > The gcore extension fails on the 3.4 kernel I'm using. It attempts to
> >> > find the offset of a member within the inode struct, but the member is
> >> > part of an anonymous union. This patch fixes the problem for me.
> >> > 
> >> > Regards,
> >> > Per
> >> 
> >> Hello Per,
> >> 
> >> Thanks for reporting that. According to git repository, this was
> >> changed by the following commit at the v3.1 period.
> >> 
> >> $ git describe a78ef704a8dd430225955f0709b22d4a6ba21deb
> >> v3.1-8569-ga78ef70
> >> 
> >> $ git log -1 a78ef704a8dd430225955f0709b22d4a6ba21deb
> >> commit a78ef704a8dd430225955f0709b22d4a6ba21deb
> >> Author: Miklos Szeredi < mszeredi at suse.cz >
> >> Date: Fri Oct 28 14:13:30 2011 +0200
> >> 
> >> vfs: protect i_nlink
> >> 
> >> Prevent direct modification of i_nlink by making it const and adding a
> >> non-const __i_nlink alias.
> >> 
> >> Signed-off-by: Miklos Szeredi < mszeredi at suse.cz >
> >> Tested-by: Toshiyuki Okajima < toshi.okajima at jp.fujitsu.com >
> >> Signed-off-by: Christoph Hellwig < hch at lst.de >
> >> 
> >> The patch appears fine to me so I'll apply it.
> >> 
> >> Thanks.
> >> HATAYAMA, Daisuke
> > 
> > Hi Daisuke,
> > 
> > Will you be updating the crash-gcore-command tar.gz package?
> > 
> 
> Hello Dave,
> 
> I have another gcore test plan soon. I'm going to update this change
> together with it. Please wait for a few weeks.
> 
> I have a curious question for the gcore. Current what we could do with
> gcore is to generate a core dump image, and then be parsed with external
> gdb along with user space lib symbol.
> 
> Could it be possible that integrating the whole process into crash itself.
> That is without referring to external gdb's help, crash itself could print out
> the call stack from user to kernel. I think it would be more convenient like
> it current is.
> 
> Do you think implement it would be complex?

Probably...

It is possible to invoke the gdb "add-symbol-file" file command giving it
the name of the user's executable and its starting address as shown by the
"vm" command, and then the embedded gdb will have a copy of the executable's
symbol values and debuginfo data.  But the top-level crash utility does not 
store those symbols.  I've done that in order to display user program data, 
say for example, the crash utility's program_context data structure:
 
 crash> vm
 PID: 2179   TASK: ffff8801f4171710  CPU: 1   COMMAND: "crash"
        MM               PGD          RSS    TOTAL_VM
 ffff88020e56d080  ffff8801fbcba000  182636k  331376k 
       VMA           START       END     FLAGS FILE
 ffff8801deae9a50     400000     a0c000 8001875 /var/CVS/crash/crash
 ffff8801deae9420     c0c000     c2d000 8101873 /var/CVS/crash/crash
 ffff8801de8da580     c2d000     dc3000 100073 
 ffff8801deafcd10    2935000    60ca000 100073 
 ffff8801de8daa50 3550000000 3550020000 8000875 /usr/lib64/ld-2.15.so
 ffff8801de8da0b0 355021f000 3550220000 8100871 /usr/lib64/ld-2.15.so
 ...
 
 crash> add-symbol-file /var/CVS/crash/crash 0x400000
 add symbol table from file "/var/CVS/crash/crash" at
         .text_addr = 0x400000
 Reading symbols from /var/CVS/crash/crash...done.
 crash>
 
 crash> whatis program_context
 struct program_context {
     char *program_name;
     char *program_path;
     char *program_version;
     char *gdb_version;
     char *prompt;
     long long unsigned int flags;
     char *namelist;
     char *dumpfile;
     char *live_memsrc;
 ...
  
 crash> p &program_context
 $11 = (struct program_context *) 0xc46ee0
 crash> struct -u program_context 0xc46ee0
 struct program_context {
   program_name = 0x7fff3d6f0806 "crash", 
   program_path = 0x7fff3d6f0804 "./crash", 
   program_version = 0x81d2b0 "6.1.0rc14", 
   gdb_version = 0x8927e9 "7.3.1", 
   prompt = 0x294acb0 "crash> ", 
   flags = 879609304517639, 
   namelist = 0x29404a0 "/usr/lib/debug/lib/modules/3.5.3-1.fc17.x86_64/vmlinux", 
   dumpfile = 0x0, 
   live_memsrc = 0x7c72b8 "/dev/crash", 
 ...

And you could query gdb for the user-space text addresses:

 crash> p &x86_64_init
 $18 = (void (*)(int)) 0x48c770 <x86_64_init>
 crash> p &cmd_vm
 $19 = (void (*)(void)) 0x425d00 <cmd_vm>
 crash>

There's no way I would consider polluting the per-arch backtrace
functions with any kind of user-space support.  But it might be
interesting to try to do something in an extension module.  

Dave


> 
> Thanks,
> Lei






More information about the Crash-utility mailing list