From: Eric W. Biederman on 3 Aug 2010 03:40 Hui Zhu <teawater(a)gmail.com> writes: > Hi, > > I found that from gdb 7.1 to gdb-cvs-head cannot analyze the core file > that get from kdump. > What I got: > [New <main task>] > [New Thread 2719] > ../../src/gdb/thread.c:884: internal-error: switch_to_thread: > Assertion `inf != NULL' failed. > A problem internal to GDB has been detected, > further debugging may prove unreliable. > Quit this debugging session? (y or n) > That is because: > objdump -h ./vmcore > > ./vmcore: file format elf64-x86-64 > > Sections: > Idx Name Size VMA LMA File off Algn > 0 note0 00000a48 0000000000000000 0000000000000000 00000238 2**0 > CONTENTS, READONLY > 1 .reg/0 000000d8 0000000000000000 0000000000000000 000002bc 2**2 > CONTENTS > 2 .reg 000000d8 0000000000000000 0000000000000000 000002bc 2**2 > CONTENTS > 3 .reg/2719 000000d8 0000000000000000 0000000000000000 00000420 2**2 > CONTENTS > 4 .reg/0 000000d8 0000000000000000 0000000000000000 00000584 2**2 > CONTENTS > 5 .reg/0 000000d8 0000000000000000 0000000000000000 000006e8 2**2 > CONTENTS > Each of reg/n is a cpu core note. It will be a GDB thread. n is the > prstatus.pr_pid that will be the thread lwpid. Because the 3 threads > pid is same, so GDB get error. > > current->pid is 0 because this cpu is in idle. So I add a check, set > prstatus.pr_pid to cpu id when current->pid is 0. Then GDB work OK > with the core. That is a gdb limitation. It looks to me like applying this patch will loose information, and give you no guarantee that prstatus.pr_pid will not equal 0. If you want to change something please do it in a post processing tool. Eric > Thanks, > Hui > > Signed-off-by: Hui Zhu <teawater(a)gmail.com> > --- > kernel/kexec.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > --- a/kernel/kexec.c > +++ b/kernel/kexec.c > @@ -1191,7 +1191,10 @@ void crash_save_cpu(struct pt_regs *regs > if (!buf) > return; > memset(&prstatus, 0, sizeof(prstatus)); > - prstatus.pr_pid = current->pid; > + if (current->pid) > + prstatus.pr_pid = current->pid; > + else > + prstatus.pr_pid = cpu; > elf_core_copy_kernel_regs(&prstatus.pr_reg, regs); > buf = append_elf_note(buf, KEXEC_CORE_NOTE_NAME, NT_PRSTATUS, > &prstatus, sizeof(prstatus)); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|
Pages: 1 Prev: Dear friend! Next: kexec: set prstatus.pr_pid to cpu id when current->pid is 0 |