Include process IDs in core dumps.
When threads were added to the kernel, the pr_pid member of the NT_PRSTATUS note was repurposed to store LWP IDs instead of process IDs. However, the process ID was no longer recorded in core dumps. This change adds a pr_pid field to prpsinfo (NT_PRSINFO). Rather than bumping the prpsinfo version number, note parsers can use the note's payload size to determine if pr_pid is present. Reviewed by: kib, emaste (older version) MFC after: 2 months Differential Revision: https://reviews.freebsd.org/D7117
This commit is contained in:
parent
fc4f075a1a
commit
ccb83afd81
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=303002
@ -1874,6 +1874,7 @@ __elfN(note_prpsinfo)(void *arg, struct sbuf *sb, size_t *sizep)
|
||||
*cp = ' ';
|
||||
}
|
||||
}
|
||||
psinfo->pr_pid = p->p_pid;
|
||||
sbuf_bcat(sb, psinfo, sizeof(*psinfo));
|
||||
free(psinfo, M_TEMP);
|
||||
}
|
||||
|
@ -49,7 +49,10 @@ typedef struct fpreg fpregset_t;
|
||||
|
||||
/*
|
||||
* The parenthsized numbers like (1) indicate the minimum version number
|
||||
* for which each element exists in the structure.
|
||||
* for which each element exists in the structure. The version number is
|
||||
* not bumped when adding new fields to the end, only if the meaning of
|
||||
* an existing field changes. Additional fields are annotated as (1a),
|
||||
* (1b), etc. to indicate the groupings of additions.
|
||||
*/
|
||||
|
||||
#define PRSTATUS_VERSION 1 /* Current version of prstatus_t */
|
||||
@ -61,7 +64,7 @@ typedef struct prstatus {
|
||||
size_t pr_fpregsetsz; /* sizeof(fpregset_t) (1) */
|
||||
int pr_osreldate; /* Kernel version (1) */
|
||||
int pr_cursig; /* Current signal (1) */
|
||||
pid_t pr_pid; /* Process ID (1) */
|
||||
pid_t pr_pid; /* LWP (Thread) ID (1) */
|
||||
gregset_t pr_reg; /* General purpose registers (1) */
|
||||
} prstatus_t;
|
||||
|
||||
@ -78,6 +81,7 @@ typedef struct prpsinfo {
|
||||
size_t pr_psinfosz; /* sizeof(prpsinfo_t) (1) */
|
||||
char pr_fname[PRFNAMESZ+1]; /* Command name, null terminated (1) */
|
||||
char pr_psargs[PRARGSZ+1]; /* Arguments, null terminated (1) */
|
||||
pid_t pr_pid; /* Process ID (1a) */
|
||||
} prpsinfo_t;
|
||||
|
||||
typedef struct thrmisc {
|
||||
@ -104,6 +108,7 @@ typedef struct prpsinfo32 {
|
||||
uint32_t pr_psinfosz;
|
||||
char pr_fname[PRFNAMESZ+1];
|
||||
char pr_psargs[PRARGSZ+1];
|
||||
int32_t pr_pid;
|
||||
} prpsinfo32_t;
|
||||
|
||||
struct thrmisc32 {
|
||||
|
@ -586,6 +586,7 @@ elf_note_prpsinfo(void *arg, size_t *sizep)
|
||||
} else
|
||||
strlcpy(psinfo->pr_psargs, kip.ki_comm,
|
||||
sizeof(psinfo->pr_psargs));
|
||||
psinfo->pr_pid = pid;
|
||||
|
||||
*sizep = sizeof(*psinfo);
|
||||
return (psinfo);
|
||||
|
Loading…
Reference in New Issue
Block a user