@@ -1177,6 +1177,41 @@ namespace libdwarf {
1177
1177
}
1178
1178
}
1179
1179
1180
+ // flatten trace with inlines
1181
+ std::vector<stacktrace_frame> flatten_inlines (const std::vector<frame_with_inlines>& trace) {
1182
+ std::vector<stacktrace_frame> final_trace;
1183
+ for (const auto & entry : trace) {
1184
+ // most recent call first
1185
+ if (!entry.inlines .empty ()) {
1186
+ // insert in reverse order
1187
+ final_trace.insert (
1188
+ final_trace.end (),
1189
+ std::make_move_iterator (entry.inlines .rbegin ()),
1190
+ std::make_move_iterator (entry.inlines .rend ())
1191
+ );
1192
+ }
1193
+ final_trace.push_back (std::move (entry.frame ));
1194
+ if (!entry.inlines .empty ()) {
1195
+ // rotate line info due to quirk of how dwarf stores this stuff
1196
+ // inclusive range
1197
+ auto begin = final_trace.end () - (1 + entry.inlines .size ());
1198
+ auto end = final_trace.end () - 1 ;
1199
+ auto carry_line = end->line ;
1200
+ auto carry_column = end->column ;
1201
+ std::string carry_filename = std::move (end->filename );
1202
+ for (auto it = end; it != begin; it--) {
1203
+ it->line = (it - 1 )->line ;
1204
+ it->column = (it - 1 )->column ;
1205
+ it->filename = std::move ((it - 1 )->filename );
1206
+ }
1207
+ begin->line = carry_line;
1208
+ begin->column = carry_column;
1209
+ begin->filename = std::move (carry_filename);
1210
+ }
1211
+ }
1212
+ return final_trace;
1213
+ }
1214
+
1180
1215
CPPTRACE_FORCE_NO_INLINE_FOR_PROFILING
1181
1216
std::vector<stacktrace_frame> resolve_frames (const std::vector<object_frame>& frames) {
1182
1217
std::vector<frame_with_inlines> trace (frames.size (), {null_frame, {}});
@@ -1206,56 +1241,29 @@ namespace libdwarf {
1206
1241
if (!should_absorb_trace_exceptions ()) {
1207
1242
throw ;
1208
1243
}
1209
- for (const auto & entry : group.second ) {
1210
- const auto & dlframe = entry.first .get ();
1211
- auto & frame = entry.second .get ();
1212
- frame = {
1213
- {
1214
- dlframe.raw_address ,
1215
- dlframe.object_address ,
1216
- nullable<std::uint32_t >::null (),
1217
- nullable<std::uint32_t >::null (),
1218
- dlframe.object_path ,
1219
- " " ,
1220
- false
1221
- },
1222
- {}
1223
- };
1224
- }
1225
1244
}
1226
1245
}
1227
- // flatten trace with inlines
1228
- std::vector<stacktrace_frame> final_trace;
1229
- for (const auto & entry : trace) {
1230
- // most recent call first
1231
- if (!entry.inlines .empty ()) {
1232
- // insert in reverse order
1233
- final_trace.insert (
1234
- final_trace.end (),
1235
- std::make_move_iterator (entry.inlines .rbegin ()),
1236
- std::make_move_iterator (entry.inlines .rend ())
1237
- );
1238
- }
1239
- final_trace.push_back (std::move (entry.frame ));
1240
- if (!entry.inlines .empty ()) {
1241
- // rotate line info due to quirk of how dwarf stores this stuff
1242
- // inclusive range
1243
- auto begin = final_trace.end () - (1 + entry.inlines .size ());
1244
- auto end = final_trace.end () - 1 ;
1245
- auto carry_line = end->line ;
1246
- auto carry_column = end->column ;
1247
- std::string carry_filename = std::move (end->filename );
1248
- for (auto it = end; it != begin; it--) {
1249
- it->line = (it - 1 )->line ;
1250
- it->column = (it - 1 )->column ;
1251
- it->filename = std::move ((it - 1 )->filename );
1252
- }
1253
- begin->line = carry_line;
1254
- begin->column = carry_column;
1255
- begin->filename = std::move (carry_filename);
1246
+ // fill in basic info for any frames where there were resolution issues
1247
+ for (std::size_t i = 0 ; i < frames.size (); i++) {
1248
+ const auto & dlframe = frames[i];
1249
+ auto & frame = trace[i];
1250
+ if (frame.frame == null_frame) {
1251
+ frame = {
1252
+ {
1253
+ dlframe.raw_address ,
1254
+ dlframe.object_address ,
1255
+ nullable<std::uint32_t >::null (),
1256
+ nullable<std::uint32_t >::null (),
1257
+ dlframe.object_path ,
1258
+ " " ,
1259
+ false
1260
+ },
1261
+ {}
1262
+ };
1256
1263
}
1257
1264
}
1258
- return final_trace;
1265
+ // flatten and finish
1266
+ return flatten_inlines (trace);
1259
1267
}
1260
1268
}
1261
1269
}
0 commit comments