From c7d0462acfc76540be06e06a1526000efd18b037 Mon Sep 17 00:00:00 2001 From: Milian Wolff Date: Sun, 1 Jun 2014 00:04:56 +0200 Subject: [PATCH] Save ptr start and end address instead of start + size. Also output that size. --- malloctrace.cpp | 18 ++++++++++-------- malloctrace_main.cpp | 25 +++++++++++++++---------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/malloctrace.cpp b/malloctrace.cpp index c192955..35b0638 100644 --- a/malloctrace.cpp +++ b/malloctrace.cpp @@ -184,18 +184,19 @@ string env(const char* variable) struct Module { string fileName; - uintptr_t baseAddress; - uint32_t size; + uintptr_t addressStart; + uintptr_t addressEnd; unsigned int id; bool isExe; bool operator<(const Module& module) const { - return make_tuple(baseAddress, size, fileName) < make_tuple(module.baseAddress, module.size, module.fileName); + return make_tuple(addressStart, addressEnd, fileName) < make_tuple(module.addressStart, module.addressEnd, module.fileName); } + bool operator!=(const Module& module) const { - return make_tuple(baseAddress, size, fileName) != make_tuple(module.baseAddress, module.size, module.fileName); + return make_tuple(addressStart, addressEnd, fileName) != make_tuple(module.addressStart, module.addressEnd, module.fileName); } }; @@ -275,12 +276,13 @@ struct Data } } - Module module{fileName, addressStart, static_cast(addressEnd - addressStart), 0, isExe}; + Module module{fileName, addressStart, addressEnd, 0, isExe}; auto it = lower_bound(modules.begin(), modules.end(), module); if (it == modules.end() || *it != module) { module.id = data->next_module_id++; - fprintf(data->out, "m %u %s %lx %d\n", module.id, module.fileName.c_str(), module.baseAddress, module.isExe); + fprintf(data->out, "m %u %s %lx %lx %d\n", module.id, module.fileName.c_str(), + module.addressStart, module.addressEnd, module.isExe); modules.insert(it, module); } @@ -308,14 +310,14 @@ struct Data // find module and offset from cache auto module = lower_bound(modules.begin(), modules.end(), ip, [] (const Module& module, const unw_word_t addr) -> bool { - return module.baseAddress + module.size < addr; + return module.addressEnd < addr; }); if (module == modules.end()) { ip = numeric_limits::max(); continue; } auto ipId = next_ipCache_id++; - fprintf(out, "i %u %u %lx\n", ipId, module->id, ip - module->baseAddress); + fprintf(out, "i %u %u %lx\n", ipId, module->id, ip - module->addressStart); ipIt = ipCache.insert(ipIt, {ip, ipId}); } ip = ipIt->second; diff --git a/malloctrace_main.cpp b/malloctrace_main.cpp index 7b89ce9..bf852d3 100644 --- a/malloctrace_main.cpp +++ b/malloctrace_main.cpp @@ -73,9 +73,10 @@ ostream& operator<<(ostream& out, const AddressInformation& info) struct Module { - Module(string _fileName, uintptr_t baseAddress, bool isExe) + Module(string _fileName, uintptr_t addressStart, uintptr_t addressEnd, bool isExe) : fileName(move(_fileName)) - , baseAddress(baseAddress) + , addressStart(addressStart) + , addressEnd(addressEnd) , isExe(isExe) { backtraceState = backtrace_create_state(fileName.c_str(), /* we are single threaded, so: not thread safe */ false, @@ -86,13 +87,13 @@ struct Module }, this); if (backtraceState) { - backtrace_fileline_initialize(backtraceState, baseAddress, isExe, + backtrace_fileline_initialize(backtraceState, addressStart, isExe, [] (void *data, const char *msg, int errnum) { const Module* module = reinterpret_cast(data); cerr << "Failed to initialize backtrace fileline for " << (module->isExe ? "executable" : "library") << module->fileName << ": " << msg << " (error code " << errnum << ")" << endl; - }, this); + }, this); } } @@ -103,7 +104,7 @@ struct Module return info; } - backtrace_pcinfo(backtraceState, baseAddress + offset, + backtrace_pcinfo(backtraceState, addressStart + offset, [] (void *data, uintptr_t /*addr*/, const char *file, int line, const char *function) -> int { auto info = reinterpret_cast(data); info->function = demangle(function); @@ -111,8 +112,9 @@ struct Module info->line = line; return 0; }, &emptyErrorCallback, &info); + if (info.function.empty()) { - backtrace_syminfo(backtraceState, baseAddress + offset, + backtrace_syminfo(backtraceState, addressStart + offset, [] (void *data, uintptr_t /*pc*/, const char *symname, uintptr_t /*symval*/, uintptr_t /*symsize*/) { if (symname) { reinterpret_cast(data)->function = demangle(symname); @@ -138,7 +140,8 @@ struct Module backtrace_state* backtraceState = nullptr; string fileName; - uintptr_t baseAddress; + uintptr_t addressStart; + uintptr_t addressEnd; bool isExe; }; @@ -229,8 +232,10 @@ int main(int argc, char** argv) string fileName; lineIn >> fileName; lineIn << hex; - uintptr_t baseAddress = 0; - lineIn >> baseAddress; + uintptr_t addressStart = 0; + lineIn >> addressStart; + uintptr_t addressEnd = 0; + lineIn >> addressEnd; bool isExe = false; lineIn << dec; lineIn >> isExe; @@ -238,7 +243,7 @@ int main(int argc, char** argv) cerr << "failed to parse line: " << line << endl; return 1; } - data.modules.push_back(make_shared(fileName, baseAddress, isExe)); + data.modules.push_back(make_shared(fileName, addressStart, addressEnd, isExe)); ++nextModuleId; } else if (mode == 'i') { InstructionPointer ip; -- 2.7.4