summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/source/Host/macosx/Host.mm27
1 files changed, 8 insertions, 19 deletions
diff --git a/lldb/source/Host/macosx/Host.mm b/lldb/source/Host/macosx/Host.mm
index 6514489b43f..9897786bea4 100644
--- a/lldb/source/Host/macosx/Host.mm
+++ b/lldb/source/Host/macosx/Host.mm
@@ -872,29 +872,18 @@ Host::OpenFileInExternalEditor (const FileSpec &file_spec, uint32_t line_no)
void
Host::Backtrace (Stream &strm, uint32_t max_frames)
{
- char backtrace_path[] = "/tmp/lldb-backtrace-tmp-XXXXXX";
- int backtrace_fd = ::mkstemp (backtrace_path);
- if (backtrace_fd != -1)
+ if (max_frames > 0)
{
std::vector<void *> frame_buffer (max_frames, NULL);
- int count = ::backtrace (&frame_buffer[0], frame_buffer.size());
- ::backtrace_symbols_fd (&frame_buffer[0], count, backtrace_fd);
-
- const off_t buffer_size = ::lseek(backtrace_fd, 0, SEEK_CUR);
-
- if (::lseek(backtrace_fd, 0, SEEK_SET) == 0)
+ int num_frames = ::backtrace (&frame_buffer[0], frame_buffer.size());
+ char** strs = ::backtrace_symbols (&frame_buffer[0], num_frames);
+ if (strs)
{
- char *buffer = (char *)::malloc (buffer_size);
- if (buffer)
- {
- ssize_t bytes_read = ::read (backtrace_fd, buffer, buffer_size);
- if (bytes_read > 0)
- strm.Write(buffer, bytes_read);
- ::free (buffer);
- }
+ // Start at 1 to skip the "Host::Backtrace" frame
+ for (int i = 1; i < num_frames; ++i)
+ strm.Printf("%s\n", strs[i]);
+ ::free (strs);
}
- ::close (backtrace_fd);
- ::unlink (backtrace_path);
}
}
OpenPOWER on IntegriCloud