Add an object address to stacktrace_frame entries, addresses #97 (no pun intended)
This commit is contained in:
parent
d5b2646283
commit
3c7a677689
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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)) {
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user