X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a82c22998b76c7109366e8aea5e1fc90154ce749..ae901b234c4a0aa7c1777b3bd181dd7f8517ad21:/src/unix/stackwalk.cpp diff --git a/src/unix/stackwalk.cpp b/src/unix/stackwalk.cpp index 2e6a5ccda4..d65700afa6 100644 --- a/src/unix/stackwalk.cpp +++ b/src/unix/stackwalk.cpp @@ -67,7 +67,7 @@ public: private: FILE *m_fp; - DECLARE_NO_COPY_CLASS(wxStdioPipe) + wxDECLARE_NO_COPY_CLASS(wxStdioPipe); }; // ============================================================================ @@ -222,7 +222,7 @@ 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) - int len = snprintf(g_buf, BUFSIZE, "addr2line -C -f -e \"%s\"", exepath.mb_str()); + int len = snprintf(g_buf, BUFSIZE, "addr2line -C -f -e \"%s\"", (const char*) exepath.mb_str()); len = (len <= 0) ? strlen(g_buf) : len; // in case snprintf() is broken for (size_t i=0; i<n; i++) { @@ -239,8 +239,9 @@ int wxStackWalker::InitFrames(wxStackFrame *arr, size_t n, void **addresses, cha // parse addr2line output (should be exactly 2 lines for each address) // reusing the g_buf used for building the command line above wxString name, filename; - unsigned long line, curr=0; - for (size_t i=0; i<n; i++) + unsigned long line = 0, + curr = 0; + for ( size_t i = 0; i < n; i++ ) { // 1st line has function name if ( fgets(g_buf, WXSIZEOF(g_buf), fp) ) @@ -253,7 +254,8 @@ int wxStackWalker::InitFrames(wxStackFrame *arr, size_t n, void **addresses, cha } else { - wxLogDebug(_T("cannot read addr2line output for %d-th stack frame!"), i); + wxLogDebug(_T("cannot read addr2line output for stack frame #%lu"), + (unsigned long)i); return false; } @@ -266,10 +268,9 @@ int wxStackWalker::InitFrames(wxStackFrame *arr, size_t n, void **addresses, cha const size_t posColon = filename.find(_T(':')); if ( posColon != wxString::npos ) { - // parse line number - if ( !wxString(filename, posColon + 1, wxString::npos). - ToULong(&line) ) - line = 0; + // parse line number (it's ok if it fails, this will just leave + // line at its current, invalid, 0 value) + wxString(filename, posColon + 1, wxString::npos).ToULong(&line); // remove line number from 'filename' filename.erase(posColon); @@ -284,11 +285,10 @@ int wxStackWalker::InitFrames(wxStackFrame *arr, size_t n, void **addresses, cha } } - if (!name.empty() || !filename.empty()) - { - // now we've got enough info to initialize curr-th stack frame: - arr[curr++].Set(name, filename, syminfo[i], i, line, addresses[i]); - } + // now we've got enough info to initialize curr-th stack frame + // (at worst, only addresses[i] and syminfo[i] have been initialized, + // but wxStackFrame::OnGetName may still be able to get function name): + arr[curr++].Set(name, filename, syminfo[i], i, line, addresses[i]); } return curr;