From abf99aad2d70e680cdfe0ad72842c9b10e50045a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 20 May 2012 20:29:22 +0000 Subject: [PATCH] Implement wxStackWalker for wxOSX. Use atos(1) to map address to their symbolic names. Closes #10067. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71513 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/osx/chkconf.h | 7 --- src/unix/stackwalk.cpp | 127 +++++++++++++++++++++++++++------------ 3 files changed, 91 insertions(+), 44 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index dda32f3a95..84a8530d22 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -581,6 +581,7 @@ OSX: - Provide native implementations of wxDatePickerCtrl and wxTimePickerCtrl. - Fix handling of positional parameters in wxPrintf() &c (David Connet). +- Implement wxStackWalker. Univ: diff --git a/include/wx/osx/chkconf.h b/include/wx/osx/chkconf.h index 98e950215f..1b56ac8981 100644 --- a/include/wx/osx/chkconf.h +++ b/include/wx/osx/chkconf.h @@ -14,13 +14,6 @@ #ifndef _WX_OSX_CHKCONF_H_ #define _WX_OSX_CHKCONF_H_ - -#if wxUSE_STACKWALKER - /* not supported under Mac */ -# undef wxUSE_STACKWALKER -# define wxUSE_STACKWALKER 0 -#endif /* wxUSE_STACKWALKER */ - /* * check graphics context option, must be on for every os x platform * we only use core graphics now on all builds, try to catch attempts diff --git a/src/unix/stackwalk.cpp b/src/unix/stackwalk.cpp index 6c234adbea..f724816e9c 100644 --- a/src/unix/stackwalk.cpp +++ b/src/unix/stackwalk.cpp @@ -130,10 +130,12 @@ void wxStackFrame::OnGetName() m_module.assign(syminfo, posOpen); } +#ifndef __WXOSX__ else // not in "module(funcname+offset)" format { m_module = syminfo; } +#endif // !__WXOSX__ } @@ -204,6 +206,28 @@ void wxStackWalker::FreeStack() m_depth = 0; } +namespace +{ + +// Helper function to read a line from the file and return it without the +// trailing newline. Line number is only used for error reporting. +bool ReadLine(FILE* fp, unsigned long num, wxString* line) +{ + if ( !fgets(g_buf, WXSIZEOF(g_buf), fp) ) + { + wxLogDebug(wxS("cannot read address information for stack frame #%lu"), + num); + return false; + } + + *line = wxString::FromAscii(g_buf); + line->RemoveLast(); + + return true; +} + +} // anonymous namespace + int wxStackWalker::InitFrames(wxStackFrame *arr, size_t n, void **addresses, char **syminfo) { // we need to launch addr2line tool to get this information and we need to @@ -220,9 +244,13 @@ int wxStackWalker::InitFrames(wxStackFrame *arr, size_t n, void **addresses, cha } } - // build the (long) command line for executing addr2line in an optimized way - // (e.g. use always chars, even in Unicode build: popen() always takes chars) + // build the command line for executing addr2line or atos under OS X using + // char* directly to avoid the conversions from Unicode +#ifdef __WXOSX__ + int len = snprintf(g_buf, BUFSIZE, "atos -p %d", (int)getpid()); +#else int len = snprintf(g_buf, BUFSIZE, "addr2line -C -f -e \"%s\"", (const char*) exepath.mb_str()); +#endif len = (len <= 0) ? strlen(g_buf) : len; // in case snprintf() is broken for (size_t i=0; i