makedumpfile --dump-dmesg option broken on 3.5 kernels and later
Bouchard Louis
louis.bouchard at canonical.com
Wed Jan 30 08:45:18 EST 2013
Hello,
Le 23/01/2013 02:19, Atsushi Kumagai a écrit :
> Hello Louis,
>
> On Tue, 22 Jan 2013 14:52:09 +0100
> Bouchard Louis <louis.bouchard at canonical.com> wrote:
>
>> Hello Kumagai-san,
>>
>> Following a suggestion from Dave Anderson, I have tested the
>> makedumpfile --dump-dmesg option. After some research, I realized that
>> the option was no longer working on 3.5 kernel and later. Here is an
>> example of the result (on Ubuntu Quantal) :
>>
>> # makedumpfile --dump-dmesg /proc/vmcore /tmp/dmesg
>> dump_dmesg: Can't find some symbols for log_buf.
>>
>> makedumpfile Failed.
>>
>> On 3.5 kernel and later, the log_end symbol no longer exists.
>>
>> This is caused by the change from byte-buffer structure to
>> variable-length record buffer of the kernel log buffer introduced by
>> this commit :
>> http://goo.gl/NCgLI
>>
>> I am curious to know if you were aware of this change and if you had
>> done some work on modifying dump_dmesg() accordingly ? Just so I don't
>> go off and try to work on something that you have already solved.
>
> Thanks for your report.
> I haven't been aware of this, so could I ask you to help me ?
>
>
> Thanks
> Atsushi Kumagai
I now have what looks like a working patch for this issue. Thank to Dave
Anderson (crash) and Eric Biederman (vmcore-dmesg) for having chewed
most of the work for me.
My only remaining problem is to be able to print the syslog level as is
provided in the previous version. Currently, the kernel doesn't export
the 'level:3' offset of the log structure in the vmcoreinfo information
provided in the vmcore.
Vivek who authored the original kernel/printk.c patch might be able to
suggest a better way to expose log.level:3 (I did try to patch the
kernel but got thrown away because of the nature of .level:3 that didn't
fit the VMCOREINFO_OFFSET macro)
In the meantime, I only found this kinda ugly hack to work around the
absence of the structure element :
> /*
> * Ugly hack around absence of log.level:3
> * Hard code log.level offset = log.dict_len + 3
> */
> level = (UCHAR(logptr + OFFSET(log.dict_len)+3)&level_mask);
>
> sprintf(buf,"<%d>[%5lld.%06ld] ",level,nanos,rem/1000);
Aside from that, I get an identical dmesg output on kernel 3.5 and after.
I would appreciate comments on the following before I send the patch to
the list.
Kind regards,
...Louis
--
Louis Bouchard
Backline Support Analyst
Canonical Ltd
Ubuntu support: http://landscape.canonical.com
More information about the kexec
mailing list