Debug.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #include "RuntimeBasePch.h"
  6. #if DBG_DUMP
  7. #ifndef USING_PAL_STDLIB
  8. #include <strsafe.h>
  9. #endif
  10. #include "Language/JavascriptStackWalker.h"
  11. WCHAR* DumpCallStack(uint frameCount) { return DumpCallStackFull(frameCount, /*print*/ true); }
  12. WCHAR* DumpCallStackFull(uint frameCount, bool print)
  13. {
  14. Js::ScriptContext* scriptContext = ThreadContext::GetContextForCurrentThread()->GetScriptContextList();
  15. Js::JavascriptStackWalker walker(scriptContext);
  16. WCHAR buffer[512];
  17. Js::StringBuilder<ArenaAllocator> sb(scriptContext->GeneralAllocator());
  18. uint fc = 0;
  19. while (walker.Walk())
  20. {
  21. void * codeAddr = walker.GetCurrentCodeAddr();
  22. if (walker.IsJavascriptFrame())
  23. {
  24. char16 debugStringBuffer[MAX_FUNCTION_BODY_DEBUG_STRING_SIZE];
  25. StringCchPrintf(buffer, _countof(buffer), _u("0x%p "), codeAddr);
  26. sb.AppendSz(buffer);
  27. // Found a JavascriptFunction. Dump its name and parameters.
  28. Js::JavascriptFunction *jsFunc = walker.GetCurrentFunction();
  29. Js::FunctionBody * jsBody = jsFunc->GetFunctionBody();
  30. const Js::CallInfo callInfo = walker.GetCallInfo();
  31. const WCHAR* sourceFileName = _u("NULL");
  32. ULONG line = 0; LONG column = 0;
  33. walker.GetSourcePosition(&sourceFileName, &line, &column);
  34. StringCchPrintf(buffer, _countof(buffer), _u("%s [%s] (0x%p, Args=%u"), jsBody->GetDisplayName(), jsBody->GetDebugNumberSet(debugStringBuffer), jsFunc,
  35. callInfo.Count);
  36. sb.AppendSz(buffer);
  37. for (uint i = 0; i < callInfo.Count; i++)
  38. {
  39. StringCchPrintf(buffer, _countof(buffer), _u(", 0x%p"), walker.GetJavascriptArgs(false /*boxArgs*/)[i]);
  40. sb.AppendSz(buffer);
  41. }
  42. StringCchPrintf(buffer, _countof(buffer), _u(")[%s (%u, %d)]\n"), sourceFileName, line + 1, column + 1);
  43. sb.AppendSz(buffer);
  44. fc++;
  45. if(fc >= frameCount)
  46. {
  47. break;
  48. }
  49. }
  50. }
  51. sb.AppendCppLiteral(_u("----------------------------------------------------------------------\n"));
  52. WCHAR* stack = sb.Detach();
  53. if(print)
  54. {
  55. Output::Print(stack);
  56. }
  57. return stack;
  58. }
  59. #endif