Add an object address to stacktrace_frame entries, addresses #97 (no pun intended)

This commit is contained in:
Jeremy 2024-02-27 00:34:45 -06:00
parent d5b2646283
commit 3c7a677689
No known key found for this signature in database
GPG Key ID: 19AA8270105E8EB4
7 changed files with 31 additions and 12 deletions

View File

@ -147,7 +147,8 @@ namespace cpptrace {
}; };
struct CPPTRACE_EXPORT stacktrace_frame { struct CPPTRACE_EXPORT stacktrace_frame {
frame_ptr address; frame_ptr raw_address;
frame_ptr object_address;
nullable<std::uint32_t> line; nullable<std::uint32_t> line;
nullable<std::uint32_t> column; nullable<std::uint32_t> column;
std::string filename; std::string filename;
@ -155,7 +156,8 @@ namespace cpptrace {
bool is_inline; bool is_inline;
bool operator==(const stacktrace_frame& other) const { bool operator==(const stacktrace_frame& other) const {
return address == other.address return raw_address == other.raw_address
&& object_address == other.object_address
&& line == other.line && line == other.line
&& column == other.column && column == other.column
&& filename == other.filename && filename == other.filename

View File

@ -79,7 +79,8 @@ CTRACE_BEGIN_DEFINITIONS
}; };
struct ctrace_stacktrace_frame { struct ctrace_stacktrace_frame {
ctrace_frame_ptr address; ctrace_frame_ptr raw_address;
ctrace_frame_ptr object_address;
uint32_t line; uint32_t line;
uint32_t column; uint32_t column;
const char* filename; const char* filename;

View File

@ -120,7 +120,7 @@ namespace cpptrace {
<< "0x" << "0x"
<< std::setw(2 * sizeof(frame_ptr)) << std::setw(2 * sizeof(frame_ptr))
<< std::setfill('0') << std::setfill('0')
<< frame.address << frame.raw_address
<< std::dec << std::dec
<< std::setfill(' '); << std::setfill(' ');
if(!frame.symbol.empty()) { if(!frame.symbol.empty()) {
@ -204,7 +204,7 @@ namespace cpptrace {
<< "0x" << "0x"
<< std::setw(2 * sizeof(frame_ptr)) << std::setw(2 * sizeof(frame_ptr))
<< std::setfill('0') << std::setfill('0')
<< frame.address << frame.raw_address
<< std::dec << std::dec
<< std::setfill(' ') << std::setfill(' ')
<< reset; << reset;

View File

@ -112,7 +112,8 @@ CTRACE_FORMAT_EPILOGUE
frames, frames,
[] (const cpptrace::stacktrace_frame& frame) -> ctrace_stacktrace_frame { [] (const cpptrace::stacktrace_frame& frame) -> ctrace_stacktrace_frame {
ctrace_stacktrace_frame new_frame; ctrace_stacktrace_frame new_frame;
new_frame.address = frame.address; new_frame.raw_address = frame.raw_address;
new_frame.object_address = frame.object_address;
new_frame.line = frame.line.value_or(invalid_pos); new_frame.line = frame.line.value_or(invalid_pos);
new_frame.column = frame.column.value_or(invalid_pos); new_frame.column = frame.column.value_or(invalid_pos);
new_frame.filename = generate_owning_string(frame.filename).data; new_frame.filename = generate_owning_string(frame.filename).data;
@ -135,7 +136,8 @@ CTRACE_FORMAT_EPILOGUE
static constexpr auto null_v = nullable_type::null().raw_value; static constexpr auto null_v = nullable_type::null().raw_value;
const ctrace_stacktrace_frame& old_frame = ptrace->frames[i]; const ctrace_stacktrace_frame& old_frame = ptrace->frames[i];
cpptrace::stacktrace_frame new_frame; cpptrace::stacktrace_frame new_frame;
new_frame.address = old_frame.address; new_frame.raw_address = old_frame.raw_address;
new_frame.object_address = old_frame.object_address;
new_frame.line = nullable_type{is_empty(old_frame.line) ? null_v : old_frame.line}; new_frame.line = nullable_type{is_empty(old_frame.line) ? null_v : old_frame.line};
new_frame.column = nullable_type{is_empty(old_frame.column) ? null_v : old_frame.column}; new_frame.column = nullable_type{is_empty(old_frame.column) ? null_v : old_frame.column};
new_frame.filename = old_frame.filename; new_frame.filename = old_frame.filename;
@ -348,7 +350,7 @@ extern "C" {
(void)std::fprintf(to, "%s0x%0*llx%s", (void)std::fprintf(to, "%s0x%0*llx%s",
blue, blue,
int(ptr_len), int(ptr_len),
cpptrace::detail::to_ull(frames[i].address), cpptrace::detail::to_ull(frames[i].raw_address),
reset); reset);
} }
if(!ctrace::is_empty(frames[i].symbol)) { if(!ctrace::is_empty(frames[i].symbol)) {

View File

@ -63,7 +63,7 @@ namespace detail {
std::vector<frame_ptr> addresses; std::vector<frame_ptr> addresses;
for(const auto& frame : vec) { for(const auto& frame : vec) {
if(frame.symbol.empty() || frame.filename.empty()) { if(frame.symbol.empty() || frame.filename.empty()) {
addresses.push_back(frame.address); addresses.push_back(frame.raw_address);
} }
} }
std::vector<stacktrace_frame> new_frames = resolver(addresses); std::vector<stacktrace_frame> new_frames = resolver(addresses);

View File

@ -406,6 +406,7 @@ namespace libdwarf {
const auto col = die.get_unsigned_attribute(DW_AT_call_column); const auto col = die.get_unsigned_attribute(DW_AT_call_column);
inlines.push_back(stacktrace_frame{ inlines.push_back(stacktrace_frame{
0, 0,
0, // TODO: Could put an object address here...
{static_cast<std::uint32_t>(line.value_or(0))}, {static_cast<std::uint32_t>(line.value_or(0))},
{static_cast<std::uint32_t>(col.value_or(0))}, {static_cast<std::uint32_t>(col.value_or(0))},
file, file,
@ -901,6 +902,7 @@ namespace libdwarf {
return { return {
{ {
frame_info.raw_address, frame_info.raw_address,
frame_info.object_address,
nullable<std::uint32_t>::null(), nullable<std::uint32_t>::null(),
nullable<std::uint32_t>::null(), nullable<std::uint32_t>::null(),
frame_info.object_path, frame_info.object_path,
@ -912,7 +914,8 @@ namespace libdwarf {
} }
stacktrace_frame frame = null_frame; stacktrace_frame frame = null_frame;
frame.filename = frame_info.object_path; frame.filename = frame_info.object_path;
frame.address = frame_info.raw_address; frame.raw_address = frame_info.raw_address;
frame.object_address = frame_info.object_address;
if(trace_dwarf) { if(trace_dwarf) {
std::fprintf( std::fprintf(
stderr, stderr,
@ -941,6 +944,7 @@ namespace libdwarf {
return { return {
{ {
frame_info.raw_address, frame_info.raw_address,
frame_info.object_address,
nullable<std::uint32_t>::null(), nullable<std::uint32_t>::null(),
nullable<std::uint32_t>::null(), nullable<std::uint32_t>::null(),
frame_info.object_path, frame_info.object_path,
@ -1145,7 +1149,8 @@ namespace libdwarf {
try { try {
frame = resolver->resolve_frame(dlframe); frame = resolver->resolve_frame(dlframe);
} catch(...) { } catch(...) {
frame.frame.address = dlframe.raw_address; frame.frame.raw_address = dlframe.raw_address;
frame.frame.object_address = dlframe.object_address;
frame.frame.filename = dlframe.object_path; frame.frame.filename = dlframe.object_path;
if(!should_absorb_trace_exceptions()) { if(!should_absorb_trace_exceptions()) {
throw; throw;
@ -1166,6 +1171,7 @@ namespace libdwarf {
frame = { frame = {
{ {
dlframe.raw_address, dlframe.raw_address,
dlframe.object_address,
nullable<std::uint32_t>::null(), nullable<std::uint32_t>::null(),
nullable<std::uint32_t>::null(), nullable<std::uint32_t>::null(),
dlframe.object_path, dlframe.object_path,

View File

@ -55,7 +55,15 @@ namespace detail {
return str; return str;
} }
static const stacktrace_frame null_frame {0, nullable<uint32_t>::null(), nullable<uint32_t>::null(), "", "", false}; static const stacktrace_frame null_frame {
0,
0,
nullable<uint32_t>::null(),
nullable<uint32_t>::null(),
"",
"",
false
};
bool should_absorb_trace_exceptions(); bool should_absorb_trace_exceptions();
bool should_resolve_inlined_calls(); bool should_resolve_inlined_calls();