#include ELFUTILS_HEADER(ebl)
/* #include ELFUTILS_HEADER(dwfl) */
#include "../libdwfl/libdwflP.h"
-/* XXX: Private header needed for find_procfile, sysprof_init_dwfl,
+/* XXX: Private header needed for find_procfile, sysprof_find_dwfl,
sample_set_initial_registers. */
#include ELFUTILS_HEADER(dwfl_stacktrace)
}
Dwfl *
-sysprof_init_dwfl (struct sysprof_unwind_info *sui,
+sysprof_init_dwfl_cb (Dwflst_Process_Tracker *cb_tracker,
+ pid_t pid,
+ void *arg __attribute__ ((unused)))
+{
+ Dwfl *dwfl = dwflst_tracker_dwfl_begin (cb_tracker);
+
+ int err = dwfl_linux_proc_report (dwfl, pid);
+ if (err < 0)
+ {
+ if (show_failures)
+ fprintf(stderr, "dwfl_linux_proc_report pid %lld: %s",
+ (long long) pid, dwfl_errmsg (-1));
+ return NULL;
+ }
+ err = dwfl_report_end (dwfl, NULL, NULL);
+ if (err != 0)
+ {
+ if (show_failures)
+ fprintf(stderr, "dwfl_report_end pid %lld: %s",
+ (long long) pid, dwfl_errmsg (-1));
+ return NULL;
+ }
+
+ return dwfl;
+}
+
+Dwfl *
+sysprof_find_dwfl (struct sysprof_unwind_info *sui,
SysprofCaptureStackUser *ev,
SysprofCaptureUserRegs *regs)
{
if (regs->n_regs < EXPECTED_REGS) /* XXX expecting everything except FLAGS */
{
if (show_failures)
- fprintf(stderr, N_("sysprof_init_dwfl: n_regs=%d, expected %d\n"),
+ fprintf(stderr, N_("sysprof_find_dwfl: n_regs=%d, expected %d\n"),
regs->n_regs, EXPECTED_REGS);
return NULL;
}
- Dwfl *dwfl = pid_find_dwfl(pid);
struct __sample_arg *sample_arg;
+ Dwfl *dwfl = dwflst_tracker_find_pid (tracker, pid, sysprof_init_dwfl_cb, NULL);
bool cached = false;
- if (dwfl != NULL)
+ if (dwfl != NULL && dwfl->process != NULL)
{
sample_arg = dwfl->process->callbacks_arg; /* XXX requires libdwflP.h */
cached = true;
goto reuse;
}
- dwfl = dwflst_tracker_dwfl_begin (tracker);
-
- int err = dwfl_linux_proc_report (dwfl, pid);
- if (err < 0)
- {
- if (show_failures)
- fprintf(stderr, "dwfl_linux_proc_report pid %lld: %s",
- (long long) pid, dwfl_errmsg (-1));
- return NULL;
- }
- err = dwfl_report_end (dwfl, NULL, NULL);
- if (err != 0)
- {
- if (show_failures)
- fprintf(stderr, "dwfl_report_end pid %lld: %s",
- (long long) pid, dwfl_errmsg (-1));
- return NULL;
- }
Elf *elf = NULL;
int elf_fd = -1;
- err = find_procfile (dwfl, &pid, &elf, &elf_fd);
+ int err = find_procfile (dwfl, &pid, &elf, &elf_fd);
if (err < 0)
{
if (show_failures)
if (show_frames) {
bool is_abi32 = (sample_arg->abi == PERF_SAMPLE_REGS_ABI_32);
- fprintf(stderr, "sysprof_init_dwfl pid %lld%s: size=%ld%s pc=%lx sp=%lx+(%lx)\n",
+ fprintf(stderr, "sysprof_find_dwfl pid %lld%s: size=%ld%s pc=%lx sp=%lx+(%lx)\n",
(long long) pid, cached ? " (cached)" : "",
sample_arg->size, is_abi32 ? " (32-bit)" : "",
sample_arg->pc, sample_arg->base_addr,
SysprofCaptureUserRegs *regs = (SysprofCaptureUserRegs *)tail_ptr;
if (show_frames)
fprintf(stderr, "\n"); /* extra newline for padding */
- Dwfl *dwfl = sysprof_init_dwfl (sui, ev, regs);
+ Dwfl *dwfl = sysprof_find_dwfl (sui, ev, regs);
if (dwfl == NULL)
{
if (show_summary)
dwfl_ent->lost_samples++;
}
if (show_failures)
- fprintf(stderr, "sysprof_init_dwfl pid %lld (%s) (failed)\n",
+ fprintf(stderr, "sysprof_find_dwfl pid %lld (%s) (failed)\n",
(long long)frame->pid, comm);
return SYSPROF_CB_OK;
}