summaryrefslogtreecommitdiffstats
path: root/libbacktrace/Corkscrew.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libbacktrace/Corkscrew.cpp')
-rw-r--r--libbacktrace/Corkscrew.cpp37
1 files changed, 20 insertions, 17 deletions
diff --git a/libbacktrace/Corkscrew.cpp b/libbacktrace/Corkscrew.cpp
index fd31a26..efeee2e 100644
--- a/libbacktrace/Corkscrew.cpp
+++ b/libbacktrace/Corkscrew.cpp
@@ -65,7 +65,8 @@ bool CorkscrewMap::Build() {
}
map.name = cur_map->name;
- maps_.push_back(map);
+ // The maps are in descending order, but we want them in ascending order.
+ maps_.push_front(map);
cur_map = cur_map->next;
}
@@ -93,8 +94,8 @@ bool CorkscrewCommon::GenerateFrameData(
it->stack_size = cork_frames[i].stack_size;
it->func_offset = 0;
- it->map = backtrace_obj_->FindMap(it->pc);
- it->func_name = backtrace_obj_->GetFunctionName(it->pc, &it->func_offset);
+ it->map = FindMap(it->pc);
+ it->func_name = GetFunctionName(it->pc, &it->func_offset);
}
return true;
}
@@ -119,7 +120,7 @@ std::string CorkscrewCurrent::GetFunctionNameRaw(uintptr_t pc, uintptr_t* offset
*offset = 0;
Dl_info info;
- const backtrace_map_t* map = backtrace_obj_->FindMap(pc);
+ const backtrace_map_t* map = FindMap(pc);
if (map) {
if (dladdr((const void*)pc, &info)) {
if (info.dli_sname) {
@@ -158,19 +159,10 @@ CorkscrewThread::CorkscrewThread() {
CorkscrewThread::~CorkscrewThread() {
}
-bool CorkscrewThread::Init() {
- if (backtrace_obj_->GetMap() == NULL) {
- // Trigger the map object creation, which will create the corkscrew
- // map information.
- return BuildMap();
- }
- return true;
-}
-
void CorkscrewThread::ThreadUnwind(
siginfo_t* siginfo, void* sigcontext, size_t num_ignore_frames) {
backtrace_frame_t cork_frames[MAX_BACKTRACE_FRAMES];
- CorkscrewMap* map = static_cast<CorkscrewMap*>(backtrace_obj_->GetMap());
+ CorkscrewMap* map = static_cast<CorkscrewMap*>(GetMap());
ssize_t num_frames = unwind_backtrace_signal_arch(
siginfo, sigcontext, map->GetMapInfo(), cork_frames,
num_ignore_frames, MAX_BACKTRACE_FRAMES);
@@ -204,12 +196,11 @@ CorkscrewPtrace::~CorkscrewPtrace() {
}
bool CorkscrewPtrace::Unwind(size_t num_ignore_frames) {
- ptrace_context_ = load_ptrace_context(backtrace_obj_->Tid());
+ ptrace_context_ = load_ptrace_context(Tid());
backtrace_frame_t frames[MAX_BACKTRACE_FRAMES];
ssize_t num_frames = unwind_backtrace_ptrace(
- backtrace_obj_->Tid(), ptrace_context_, frames, num_ignore_frames,
- MAX_BACKTRACE_FRAMES);
+ Tid(), ptrace_context_, frames, num_ignore_frames, MAX_BACKTRACE_FRAMES);
return GenerateFrameData(frames, num_frames);
}
@@ -246,3 +237,15 @@ Backtrace* CreateThreadObj(pid_t tid, BacktraceMap* map) {
CorkscrewThread* thread_obj = new CorkscrewThread();
return new BacktraceThread(thread_obj, thread_obj, tid, map);
}
+
+//-------------------------------------------------------------------------
+// BacktraceMap create function.
+//-------------------------------------------------------------------------
+BacktraceMap* BacktraceMap::Create(pid_t pid) {
+ BacktraceMap* map = new CorkscrewMap(pid);
+ if (!map->Build()) {
+ delete map;
+ return NULL;
+ }
+ return map;
+}