linux-user/elfload: Fix pr_pid values in core files
Analyzing qemu-produced core dumps of multi-threaded apps runs into: (gdb) info threads [...] 21 Thread 0x3ff83cc0740 (LWP 9295) warning: Couldn't find general-purpose registers in core file. <unavailable> in ?? () The reason is that all pr_pid values are the same, because the same TaskState is used for all CPUs when generating NT_PRSTATUS notes. Fix by using TaskStates associated with individual CPUs. Cc: qemu-stable@nongnu.org Fixes:243c470662
("linux-user/elfload: Write corefile elf header in one block") Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-ID: <20240801202340.21845-1-iii@linux.ibm.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> (cherry picked from commit5b0c2742c8
) Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
This commit is contained in:
parent
986e253afd
commit
ce15d843f1
@ -4175,8 +4175,7 @@ static void fill_elf_note_phdr(struct elf_phdr *phdr, size_t sz, off_t offset)
|
||||
bswap_phdr(phdr, 1);
|
||||
}
|
||||
|
||||
static void fill_prstatus_note(void *data, const TaskState *ts,
|
||||
CPUState *cpu, int signr)
|
||||
static void fill_prstatus_note(void *data, CPUState *cpu, int signr)
|
||||
{
|
||||
/*
|
||||
* Because note memory is only aligned to 4, and target_elf_prstatus
|
||||
@ -4186,7 +4185,7 @@ static void fill_prstatus_note(void *data, const TaskState *ts,
|
||||
struct target_elf_prstatus prstatus = {
|
||||
.pr_info.si_signo = signr,
|
||||
.pr_cursig = signr,
|
||||
.pr_pid = ts->ts_tid,
|
||||
.pr_pid = get_task_state(cpu)->ts_tid,
|
||||
.pr_ppid = getppid(),
|
||||
.pr_pgrp = getpgrp(),
|
||||
.pr_sid = getsid(0),
|
||||
@ -4501,8 +4500,7 @@ static int elf_core_dump(int signr, const CPUArchState *env)
|
||||
CPU_FOREACH(cpu_iter) {
|
||||
dptr = fill_note(&hptr, NT_PRSTATUS, "CORE",
|
||||
sizeof(struct target_elf_prstatus));
|
||||
fill_prstatus_note(dptr, ts, cpu_iter,
|
||||
cpu_iter == cpu ? signr : 0);
|
||||
fill_prstatus_note(dptr, cpu_iter, cpu_iter == cpu ? signr : 0);
|
||||
}
|
||||
|
||||
if (dump_write(fd, header, data_offset) < 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user