// 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++)
{
// 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) )
}
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;
}
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);
}
}
- 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;