Skip to content

Commit dbc0cb0

Browse files
author
Walter Erquinigo
committed
[trace] Avoid a crash in the dumper when disassembling fails
In rare situations, disassemblying would fail that produce an invalid InstructionSP object. We need to check that it's valid before using. With this change, now the dumper doesn't crash with dumping instructions of ioctl. In fact, it now dumps this output { "id": 6135, "loadAddress": "0x7f4bfe5c7515", "module": "libc.so.6", "symbol": "ioctl", "source": "glibc/2.34/src/glibc-2.34/sysdeps/unix/syscall-template.S", "line": 120, "column": 0 } Anyway, we need to investigate why the diassembler failed disassembling that instruction. From over 2B instructions I was disassembling today, just this one failed, so this could be a bug in LLVM's core disassembler. Differential Revision: https://reviews.llvm.org/D129588
1 parent ad7bcda commit dbc0cb0

File tree

1 file changed

+32
-24
lines changed

1 file changed

+32
-24
lines changed

lldb/source/Target/TraceDumper.cpp

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ class OutputWriterCLI : public TraceDumper::OutputWriter {
145145
m_s << "(error) " << *item.error;
146146
} else {
147147
m_s.Format("{0:x+16}", item.load_address);
148-
if (item.symbol_info) {
148+
if (item.symbol_info && item.symbol_info->instruction) {
149149
m_s << " ";
150150
item.symbol_info->instruction->Dump(
151151
&m_s, /*max_opcode_byte_size=*/0,
@@ -200,6 +200,35 @@ class OutputWriterJSON : public TraceDumper::OutputWriter {
200200

201201
~OutputWriterJSON() { m_j.arrayEnd(); }
202202

203+
void DumpEvent(const TraceDumper::TraceItem &item) {
204+
m_j.attribute("event", TraceCursor::EventKindToString(*item.event));
205+
}
206+
207+
void DumpInstruction(const TraceDumper::TraceItem &item) {
208+
m_j.attribute("loadAddress", formatv("{0:x}", item.load_address));
209+
if (item.symbol_info) {
210+
m_j.attribute("module", ToOptionalString(GetModuleName(item)));
211+
m_j.attribute(
212+
"symbol",
213+
ToOptionalString(item.symbol_info->sc.GetFunctionName().AsCString()));
214+
215+
if (item.symbol_info->instruction) {
216+
m_j.attribute("mnemonic",
217+
ToOptionalString(item.symbol_info->instruction->GetMnemonic(
218+
&item.symbol_info->exe_ctx)));
219+
}
220+
221+
if (IsLineEntryValid(item.symbol_info->sc.line_entry)) {
222+
m_j.attribute(
223+
"source",
224+
ToOptionalString(
225+
item.symbol_info->sc.line_entry.file.GetPath().c_str()));
226+
m_j.attribute("line", item.symbol_info->sc.line_entry.line);
227+
m_j.attribute("column", item.symbol_info->sc.line_entry.column);
228+
}
229+
}
230+
}
231+
203232
void TraceItem(const TraceDumper::TraceItem &item) override {
204233
m_j.object([&] {
205234
m_j.attribute("id", item.id);
@@ -209,9 +238,7 @@ class OutputWriterJSON : public TraceDumper::OutputWriter {
209238
item.tsc ? Optional<std::string>(std::to_string(*item.tsc)) : None);
210239

211240
if (item.event) {
212-
m_j.object([&] {
213-
m_j.attribute("event", TraceCursor::EventKindToString(*item.event));
214-
});
241+
DumpEvent(item);
215242
return;
216243
}
217244

@@ -221,26 +248,7 @@ class OutputWriterJSON : public TraceDumper::OutputWriter {
221248
}
222249

223250
// we know we are seeing an actual instruction
224-
m_j.attribute("loadAddress", formatv("{0:x}", item.load_address));
225-
if (item.symbol_info) {
226-
m_j.attribute("module", ToOptionalString(GetModuleName(item)));
227-
m_j.attribute("symbol",
228-
ToOptionalString(
229-
item.symbol_info->sc.GetFunctionName().AsCString()));
230-
m_j.attribute(
231-
"mnemonic",
232-
ToOptionalString(item.symbol_info->instruction->GetMnemonic(
233-
&item.symbol_info->exe_ctx)));
234-
235-
if (IsLineEntryValid(item.symbol_info->sc.line_entry)) {
236-
m_j.attribute(
237-
"source",
238-
ToOptionalString(
239-
item.symbol_info->sc.line_entry.file.GetPath().c_str()));
240-
m_j.attribute("line", item.symbol_info->sc.line_entry.line);
241-
m_j.attribute("column", item.symbol_info->sc.line_entry.column);
242-
}
243-
}
251+
DumpInstruction(item);
244252
});
245253
}
246254

0 commit comments

Comments
 (0)