Prev: kexec: set prstatus.pr_pid to cpu id when current->pid is 0
Next: [PATCH] [Bug 16494] NFS client over TCP hangs due to packet loss
From: Hui Zhu on 3 Aug 2010 03:50 On Tue, Aug 3, 2010 at 15:37, Eric W. Biederman <ebiederm(a)xmission.com> wrote: > 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 Equal 0 is not a bug, the trouble is a lot of core's pid is same. This is what gdb say: /* Found an old thread with the same id. It has to be dead, otherwise we wouldn't be adding a new thread with the same id. The OS is reusing this id --- delete it, and recreate a new one. */ Hui > > >> 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/ |