Skip to content

Commit

Permalink
Print column info in backtraces et al. if available
Browse files Browse the repository at this point in the history
This patch allows LLDB to print column info in backtraces et al. if
available, which is useful when the backtrace contains a frame like
the following:

  f(can_crash(0), can_crash(1));

Differential Revision: https://reviews.llvm.org/D51661

llvm-svn: 341506
  • Loading branch information
adrian-prantl committed Sep 5, 2018
1 parent 9ec2304 commit 4954f6a
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 3 deletions.
1 change: 1 addition & 0 deletions lldb/include/lldb/Core/FormatEntity.h
Expand Up @@ -104,6 +104,7 @@ class FormatEntity {
FunctionIsOptimized,
LineEntryFile,
LineEntryLineNumber,
LineEntryColumn,
LineEntryStartAddress,
LineEntryEndAddress,
CurrentPCArrow
Expand Down
@@ -1,6 +1,6 @@
LEVEL = ../../make

C_SOURCES := main.c
CFLAGS_EXTRAS := -fsanitize=address -g
CFLAGS_EXTRAS := -fsanitize=address -g -gcolumn-info

include $(LEVEL)/Makefile.rules
Expand Up @@ -37,6 +37,7 @@ def setUp(self):
self.line_free = line_number('main.c', '// free line')
self.line_breakpoint = line_number('main.c', '// break line')
self.line_crash = line_number('main.c', '// BOOM line')
self.col_crash = 16

def asan_tests(self):
exe = self.getBuildArtifact("a.out")
Expand All @@ -63,7 +64,7 @@ def asan_tests(self):
lldb.eStopReasonInstrumentation)

self.expect("bt", "The backtrace should show the crashing line",
substrs=['main.c:%d' % self.line_crash])
substrs=['main.c:%d:%d' % (self.line_crash, self.col_crash)])

self.expect(
"thread info -s",
Expand Down
3 changes: 2 additions & 1 deletion lldb/source/Core/Debugger.cpp
Expand Up @@ -121,7 +121,8 @@ OptionEnumValueElement g_language_enumerators[] = {
"${module.file.basename}{`${function.name-without-args}" \
"{${frame.no-debug}${function.pc-offset}}}}"

#define FILE_AND_LINE "{ at ${line.file.basename}:${line.number}}"
#define FILE_AND_LINE \
"{ at ${line.file.basename}:${line.number}{:${line.column}}}"
#define IS_OPTIMIZED "{${function.is-optimized} [opt]}"

#define DEFAULT_THREAD_FORMAT \
Expand Down
12 changes: 12 additions & 0 deletions lldb/source/Core/FormatEntity.cpp
Expand Up @@ -146,6 +146,7 @@ static FormatEntity::Entry::Definition g_function_child_entries[] = {
static FormatEntity::Entry::Definition g_line_child_entries[] = {
ENTRY_CHILDREN("file", LineEntryFile, None, g_file_child_entries),
ENTRY("number", LineEntryLineNumber, UInt32),
ENTRY("column", LineEntryColumn, UInt32),
ENTRY("start-addr", LineEntryStartAddress, UInt64),
ENTRY("end-addr", LineEntryEndAddress, UInt64),
};
Expand Down Expand Up @@ -372,6 +373,7 @@ const char *FormatEntity::Entry::TypeToCString(Type t) {
ENUM_TO_CSTR(FunctionIsOptimized);
ENUM_TO_CSTR(LineEntryFile);
ENUM_TO_CSTR(LineEntryLineNumber);
ENUM_TO_CSTR(LineEntryColumn);
ENUM_TO_CSTR(LineEntryStartAddress);
ENUM_TO_CSTR(LineEntryEndAddress);
ENUM_TO_CSTR(CurrentPCArrow);
Expand Down Expand Up @@ -1814,6 +1816,16 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
}
return false;

case Entry::Type::LineEntryColumn:
if (sc && sc->line_entry.IsValid() && sc->line_entry.column) {
const char *format = "%" PRIu32;
if (!entry.printf_format.empty())
format = entry.printf_format.c_str();
s.Printf(format, sc->line_entry.column);
return true;
}
return false;

case Entry::Type::LineEntryStartAddress:
case Entry::Type::LineEntryEndAddress:
if (sc && sc->line_entry.range.GetBaseAddress().IsValid()) {
Expand Down

0 comments on commit 4954f6a

Please sign in to comment.