aboutsummaryrefslogtreecommitdiff
path: root/proc.c
diff options
context:
space:
mode:
authorPetr Machata <pmachata@redhat.com>2013-01-06 17:16:24 +0100
committerPetr Machata <pmachata@redhat.com>2013-03-08 22:55:30 +0100
commitaf1e603fa8afd1ed0f1819a984c57311efbc7f1f (patch)
treeba9c2f773d804ab0591cb61a41cfee8a296e8bd6 /proc.c
parentf9f3df4c9e232dc06b769daa5edf489675c5cdfc (diff)
downloadltrace-af1e603fa8afd1ed0f1819a984c57311efbc7f1f.tar.gz
Tolarate failures in initialization of unwinding
Output should verify whether unwinding was properly initialized. Said initialization should be skipped altogether unless requested on command line.
Diffstat (limited to 'proc.c')
-rw-r--r--proc.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/proc.c b/proc.c
index ffc2029..77f20ec 100644
--- a/proc.c
+++ b/proc.c
@@ -38,6 +38,7 @@
#include "breakpoint.h"
#include "debug.h"
#include "fetch.h"
+#include "options.h"
#include "proc.h"
#include "value_dict.h"
@@ -105,8 +106,10 @@ static void
destroy_unwind(struct process *proc)
{
#if defined(HAVE_LIBUNWIND)
- _UPT_destroy(proc->unwind_priv);
- unw_destroy_addr_space(proc->unwind_as);
+ if (proc->unwind_priv != NULL)
+ _UPT_destroy(proc->unwind_priv);
+ if (proc->unwind_as != NULL)
+ unw_destroy_addr_space(proc->unwind_as);
#endif /* defined(HAVE_LIBUNWIND) */
}
@@ -148,11 +151,22 @@ process_bare_init(struct process *proc, const char *filename,
proc->breakpoints = NULL;
}
+ if (options.bt_depth > 0) {
#if defined(HAVE_LIBUNWIND)
- proc->unwind_priv = _UPT_create(pid);
- proc->unwind_as = unw_create_addr_space(&_UPT_accessors, 0);
+ proc->unwind_priv = _UPT_create(pid);
+ proc->unwind_as = unw_create_addr_space(&_UPT_accessors, 0);
#endif /* defined(HAVE_LIBUNWIND) */
+ if (proc->unwind_priv == NULL || proc->unwind_as == NULL) {
+ fprintf(stderr,
+ "Couldn't initialize unwinding "
+ "for process %d\n", proc->pid);
+ destroy_unwind(proc);
+ proc->unwind_priv = NULL;
+ proc->unwind_as = NULL;
+ }
+ }
+
return 0;
}