From 055326526829f75bc49f68ea51d2be406241eb2f Mon Sep 17 00:00:00 2001 From: "dbaron%dbaron.org" Date: Tue, 14 Aug 2007 16:34:32 +0000 Subject: [PATCH] Include file name and line number in Windows stack traces. b=391850 r+a=bsmedberg git-svn-id: svn://10.0.0.236/trunk@232044 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/xpcom/base/nsStackWalk.cpp | 37 ++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/mozilla/xpcom/base/nsStackWalk.cpp b/mozilla/xpcom/base/nsStackWalk.cpp index 2c5999d45a5..142109bcb26 100644 --- a/mozilla/xpcom/base/nsStackWalk.cpp +++ b/mozilla/xpcom/base/nsStackWalk.cpp @@ -906,16 +906,18 @@ NS_DescribeCodeAddress(void *aPC, nsCodeAddressDetails *aDetails) DWORD64 addr = (DWORD64)aPC; IMAGEHLP_MODULE64 modInfo; + IMAGEHLP_LINE64 lineInfo; modInfo.SizeOfStruct = sizeof(modInfo); BOOL modInfoRes; - modInfoRes = SymGetModuleInfoEspecial64(myProcess, addr, &modInfo, nsnull); + modInfoRes = SymGetModuleInfoEspecial64(myProcess, addr, &modInfo, &lineInfo); if (modInfoRes) { PL_strncpyz(aDetails->library, modInfo.ModuleName, sizeof(aDetails->library)); aDetails->loffset = (char*) aPC - (char*) modInfo.BaseOfImage; - // XXX We could get filename/lineno information from - // SymGetModuleInfoEspecial64 + PL_strncpyz(aDetails->filename, lineInfo.FileName, + sizeof(aDetails->filename)); + aDetails->lineno = lineInfo.LineNumber; } ULONG64 buffer[(sizeof(SYMBOL_INFO) + @@ -942,16 +944,18 @@ NS_DescribeCodeAddress(void *aPC, nsCodeAddressDetails *aDetails) DWORD addr = (DWORD)aPC; IMAGEHLP_MODULE modInfo; + IMAGEHLP_LINE lineInfo; modInfo.SizeOfStruct = sizeof(modInfo); BOOL modInfoRes; - modInfoRes = SymGetModuleInfoEspecial(myProcess, addr, &modInfo, nsnull); + modInfoRes = SymGetModuleInfoEspecial(myProcess, addr, &modInfo, &lineInfo); if (modInfoRes) { PL_strncpyz(aDetails->library, modInfo.ModuleName, sizeof(aDetails->library)); aDetails->loffset = (char*) aPC - (char*) modInfo.BaseOfImage; - // XXX We could get filename/lineno information from - // SymGetModuleInfoEspecial + PL_strncpyz(aDetails->filename, lineInfo.FileName, + sizeof(aDetails->filename)); + aDetails->lineno = lineInfo.LineNumber; } #ifdef USING_WXP_VERSION @@ -996,20 +1000,33 @@ NS_FormatCodeAddressDetails(void *aPC, const nsCodeAddressDetails *aDetails, #ifdef USING_WXP_VERSION if (_StackWalk64) { if (aDetails->function[0]) - _snprintf(aBuffer, aBufferSize, "%s!%s+0x%016lX\n", + _snprintf(aBuffer, aBufferSize, "%s!%s+0x%016lX", aDetails->library, aDetails->function, aDetails->foffset); else - _snprintf(aBuffer, aBufferSize, "0x%016lX\n", aPC); + _snprintf(aBuffer, aBufferSize, "0x%016lX", aPC); } else { #endif if (aDetails->function[0]) - _snprintf(aBuffer, aBufferSize, "%s!%s+0x%08lX\n", + _snprintf(aBuffer, aBufferSize, "%s!%s+0x%08lX", aDetails->library, aDetails->function, aDetails->foffset); else - _snprintf(aBuffer, aBufferSize, "0x%08lX\n", aPC); + _snprintf(aBuffer, aBufferSize, "0x%08lX", aPC); #ifdef USING_WXP_VERSION } #endif + aBuffer[aBufferSize - 1] = '\0'; + + PRUint32 len = strlen(aBuffer); + if (aDetails->filename[0]) { + _snprintf(aBuffer + len, aBufferSize - len, " (%s, line %d)\n", + aDetails->filename, aDetails->lineno); + } else { + aBuffer[len] = '\n'; + if (++len != aBufferSize) + aBuffer[len] = '\0'; + } + aBuffer[aBufferSize - 2] = '\n'; + aBuffer[aBufferSize - 1] = '\0'; return NS_OK; }