<div dir="ltr">Your fix looks correct. Sorry for the breakage, I thought there'd be one Unix implementation of that function...</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 4, 2015 at 6:34 PM, Mehdi Amini <span dir="ltr"><<a href="mailto:mehdi.amini@apple.com" target="_blank">mehdi.amini@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Reid,<br>
<br>
It seems that this commit broke the OS X build, I tried to fix it in r252137, can you take a look?<br>
<br>
Thanks,<br>
<br>
Mehdi<br>
<span class="im HOEnZb"><br>
> On Nov 4, 2015, at 5:07 PM, Reid Kleckner via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br>
><br>
</span><div class="HOEnZb"><div class="h5">> Author: rnk<br>
> Date: Wed Nov  4 19:07:54 2015<br>
> New Revision: 252118<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=252118&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=252118&view=rev</a><br>
> Log:<br>
> [Windows] Symbolize with llvm-symbolizer instead of dbghelp in a self-host<br>
><br>
> Summary:<br>
> llvm-symbolizer understands both PDBs and DWARF, so it is more likely to<br>
> succeed at symbolization. If llvm-symbolizer is unavailable, we will<br>
> fall back to dbghelp. This also makes our crash traces more similar<br>
> between Windows and Linux.<br>
><br>
> Reviewers: Bigcheese, zturner, chapuni<br>
><br>
> Subscribers: llvm-commits<br>
><br>
> Differential Revision: <a href="http://reviews.llvm.org/D12884" rel="noreferrer" target="_blank">http://reviews.llvm.org/D12884</a><br>
><br>
> Modified:<br>
>    llvm/trunk/lib/Support/Signals.cpp<br>
>    llvm/trunk/lib/Support/Unix/Signals.inc<br>
>    llvm/trunk/lib/Support/Windows/Signals.inc<br>
><br>
> Modified: llvm/trunk/lib/Support/Signals.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Signals.cpp?rev=252118&r1=252117&r2=252118&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Signals.cpp?rev=252118&r1=252117&r2=252118&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Support/Signals.cpp (original)<br>
> +++ llvm/trunk/lib/Support/Signals.cpp Wed Nov  4 19:07:54 2015<br>
> @@ -12,10 +12,20 @@<br>
> //<br>
> //===----------------------------------------------------------------------===//<br>
><br>
> +#include "llvm/ADT/STLExtras.h"<br>
> +#include "llvm/ADT/StringRef.h"<br>
> #include "llvm/Config/config.h"<br>
> +#include "llvm/Support/ErrorOr.h"<br>
> +#include "llvm/Support/FileSystem.h"<br>
> +#include "llvm/Support/FileUtilities.h"<br>
> +#include "llvm/Support/Format.h"<br>
> #include "llvm/Support/ManagedStatic.h"<br>
> +#include "llvm/Support/MemoryBuffer.h"<br>
> +#include "llvm/Support/Mutex.h"<br>
> +#include "llvm/Support/Program.h"<br>
> #include "llvm/Support/Signals.h"<br>
> -<br>
> +#include "llvm/Support/StringSaver.h"<br>
> +#include "llvm/Support/raw_ostream.h"<br>
> #include <vector><br>
><br>
> namespace llvm {<br>
> @@ -37,6 +47,118 @@ void sys::RunSignalHandlers() {<br>
> }<br>
> }<br>
><br>
> +using namespace llvm;<br>
> +<br>
> +static bool findModulesAndOffsets(void **StackTrace, int Depth,<br>
> +                                  const char **Modules, intptr_t *Offsets,<br>
> +                                  const char *MainExecutableName,<br>
> +                                  StringSaver &StrPool);<br>
> +<br>
> +/// Format a pointer value as hexadecimal. Zero pad it out so its always the<br>
> +/// same width.<br>
> +static FormattedNumber format_ptr(void *PC) {<br>
> +  // Each byte is two hex digits plus 2 for the 0x prefix.<br>
> +  unsigned PtrWidth = 2 + 2 * sizeof(void *);<br>
> +  return format_hex((uint64_t)PC, PtrWidth);<br>
> +}<br>
> +<br>
> +/// Helper that launches llvm-symbolizer and symbolizes a backtrace.<br>
> +static bool printSymbolizedStackTrace(void **StackTrace, int Depth,<br>
> +                                      llvm::raw_ostream &OS) {<br>
> +  // FIXME: Subtract necessary number from StackTrace entries to turn return addresses<br>
> +  // into actual instruction addresses.<br>
> +  // Use llvm-symbolizer tool to symbolize the stack traces.<br>
> +  ErrorOr<std::string> LLVMSymbolizerPathOrErr =<br>
> +      sys::findProgramByName("llvm-symbolizer");<br>
> +  if (!LLVMSymbolizerPathOrErr)<br>
> +    return false;<br>
> +  const std::string &LLVMSymbolizerPath = *LLVMSymbolizerPathOrErr;<br>
> +  // We don't know argv0 or the address of main() at this point, but try<br>
> +  // to guess it anyway (it's possible on some platforms).<br>
> +  std::string MainExecutableName = sys::fs::getMainExecutable(nullptr, nullptr);<br>
> +  if (MainExecutableName.empty() ||<br>
> +      MainExecutableName.find("llvm-symbolizer") != std::string::npos)<br>
> +    return false;<br>
> +<br>
> +  BumpPtrAllocator Allocator;<br>
> +  StringSaver StrPool(Allocator);<br>
> +  std::vector<const char *> Modules(Depth, nullptr);<br>
> +  std::vector<intptr_t> Offsets(Depth, 0);<br>
> +  if (!findModulesAndOffsets(StackTrace, Depth, Modules.data(), Offsets.data(),<br>
> +                             MainExecutableName.c_str(), StrPool))<br>
> +    return false;<br>
> +  int InputFD;<br>
> +  SmallString<32> InputFile, OutputFile;<br>
> +  sys::fs::createTemporaryFile("symbolizer-input", "", InputFD, InputFile);<br>
> +  sys::fs::createTemporaryFile("symbolizer-output", "", OutputFile);<br>
> +  FileRemover InputRemover(InputFile.c_str());<br>
> +  FileRemover OutputRemover(OutputFile.c_str());<br>
> +<br>
> +  {<br>
> +    raw_fd_ostream Input(InputFD, true);<br>
> +    for (int i = 0; i < Depth; i++) {<br>
> +      if (Modules[i])<br>
> +        Input << Modules[i] << " " << (void*)Offsets[i] << "\n";<br>
> +    }<br>
> +  }<br>
> +<br>
> +  StringRef InputFileStr(InputFile);<br>
> +  StringRef OutputFileStr(OutputFile);<br>
> +  StringRef StderrFileStr;<br>
> +  const StringRef *Redirects[] = {&InputFileStr, &OutputFileStr,<br>
> +                                  &StderrFileStr};<br>
> +  const char *Args[] = {"llvm-symbolizer", "--functions=linkage", "--inlining",<br>
> +#ifdef LLVM_ON_WIN32<br>
> +                        // Pass --relative-address on Windows so that we don't<br>
> +                        // have to add ImageBase from PE file.<br>
> +                        // FIXME: Make this the default for llvm-symbolizer.<br>
> +                        "--relative-address",<br>
> +#endif<br>
> +                        "--demangle", nullptr};<br>
> +  int RunResult =<br>
> +      sys::ExecuteAndWait(LLVMSymbolizerPath, Args, nullptr, Redirects);<br>
> +  if (RunResult != 0)<br>
> +    return false;<br>
> +<br>
> +  // This report format is based on the sanitizer stack trace printer.  See<br>
> +  // sanitizer_stacktrace_printer.cc in compiler-rt.<br>
> +  auto OutputBuf = MemoryBuffer::getFile(OutputFile.c_str());<br>
> +  if (!OutputBuf)<br>
> +    return false;<br>
> +  StringRef Output = OutputBuf.get()->getBuffer();<br>
> +  SmallVector<StringRef, 32> Lines;<br>
> +  Output.split(Lines, "\n");<br>
> +  auto CurLine = Lines.begin();<br>
> +  int frame_no = 0;<br>
> +  for (int i = 0; i < Depth; i++) {<br>
> +    if (!Modules[i]) {<br>
> +      OS << '#' << frame_no++ << ' ' << format_ptr(StackTrace[i]) << '\n';<br>
> +      continue;<br>
> +    }<br>
> +    // Read pairs of lines (function name and file/line info) until we<br>
> +    // encounter empty line.<br>
> +    for (;;) {<br>
> +      if (CurLine == Lines.end())<br>
> +        return false;<br>
> +      StringRef FunctionName = *CurLine++;<br>
> +      if (FunctionName.empty())<br>
> +        break;<br>
> +      OS << '#' << frame_no++ << ' ' << format_ptr(StackTrace[i]) << ' ';<br>
> +      if (!FunctionName.startswith("??"))<br>
> +        OS << FunctionName << ' ';<br>
> +      if (CurLine == Lines.end())<br>
> +        return false;<br>
> +      StringRef FileLineInfo = *CurLine++;<br>
> +      if (!FileLineInfo.startswith("??"))<br>
> +        OS << FileLineInfo;<br>
> +      else<br>
> +        OS << "(" << Modules[i] << '+' << format_hex(Offsets[i], 0) << ")";<br>
> +      OS << "\n";<br>
> +    }<br>
> +  }<br>
> +  return true;<br>
> +}<br>
> +<br>
> // Include the platform-specific parts of this class.<br>
> #ifdef LLVM_ON_UNIX<br>
> #include "Unix/Signals.inc"<br>
><br>
> Modified: llvm/trunk/lib/Support/Unix/Signals.inc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Signals.inc?rev=252118&r1=252117&r2=252118&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Signals.inc?rev=252118&r1=252117&r2=252118&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Support/Unix/Signals.inc (original)<br>
> +++ llvm/trunk/lib/Support/Unix/Signals.inc Wed Nov  4 19:07:54 2015<br>
> @@ -291,7 +291,8 @@ static int dl_iterate_phdr_cb(dl_phdr_in<br>
><br>
> static bool findModulesAndOffsets(void **StackTrace, int Depth,<br>
>                                   const char **Modules, intptr_t *Offsets,<br>
> -                                  const char *MainExecutableName) {<br>
> +                                  const char *MainExecutableName,<br>
> +                                  StringSaver &StrPool) {<br>
>   DlIteratePhdrData data = {StackTrace, Depth,   true,<br>
>                             Modules,    Offsets, MainExecutableName};<br>
>   dl_iterate_phdr(dl_iterate_phdr_cb, &data);<br>
> @@ -304,92 +305,6 @@ static bool findModulesAndOffsets(void *<br>
>   return false;<br>
> }<br>
> #endif<br>
> -<br>
> -static bool printSymbolizedStackTrace(void **StackTrace, int Depth,<br>
> -                                      llvm::raw_ostream &OS) {<br>
> -  // FIXME: Subtract necessary number from StackTrace entries to turn return addresses<br>
> -  // into actual instruction addresses.<br>
> -  // Use llvm-symbolizer tool to symbolize the stack traces.<br>
> -  ErrorOr<std::string> LLVMSymbolizerPathOrErr =<br>
> -      sys::findProgramByName("llvm-symbolizer");<br>
> -  if (!LLVMSymbolizerPathOrErr)<br>
> -    return false;<br>
> -  const std::string &LLVMSymbolizerPath = *LLVMSymbolizerPathOrErr;<br>
> -  // We don't know argv0 or the address of main() at this point, but try<br>
> -  // to guess it anyway (it's possible on some platforms).<br>
> -  std::string MainExecutableName = sys::fs::getMainExecutable(nullptr, nullptr);<br>
> -  if (MainExecutableName.empty() ||<br>
> -      MainExecutableName.find("llvm-symbolizer") != std::string::npos)<br>
> -    return false;<br>
> -<br>
> -  std::vector<const char *> Modules(Depth, nullptr);<br>
> -  std::vector<intptr_t> Offsets(Depth, 0);<br>
> -  if (!findModulesAndOffsets(StackTrace, Depth, Modules.data(), Offsets.data(),<br>
> -                             MainExecutableName.c_str()))<br>
> -    return false;<br>
> -  int InputFD;<br>
> -  SmallString<32> InputFile, OutputFile;<br>
> -  sys::fs::createTemporaryFile("symbolizer-input", "", InputFD, InputFile);<br>
> -  sys::fs::createTemporaryFile("symbolizer-output", "", OutputFile);<br>
> -  FileRemover InputRemover(InputFile.c_str());<br>
> -  FileRemover OutputRemover(OutputFile.c_str());<br>
> -<br>
> -  {<br>
> -    raw_fd_ostream Input(InputFD, true);<br>
> -    for (int i = 0; i < Depth; i++) {<br>
> -      if (Modules[i])<br>
> -        Input << Modules[i] << " " << (void*)Offsets[i] << "\n";<br>
> -    }<br>
> -  }<br>
> -<br>
> -  StringRef InputFileStr(InputFile);<br>
> -  StringRef OutputFileStr(OutputFile);<br>
> -  StringRef StderrFileStr;<br>
> -  const StringRef *Redirects[] = {&InputFileStr, &OutputFileStr,<br>
> -                                  &StderrFileStr};<br>
> -  const char *Args[] = {"llvm-symbolizer", "--functions=linkage", "--inlining",<br>
> -                        "--demangle", nullptr};<br>
> -  int RunResult =<br>
> -      sys::ExecuteAndWait(LLVMSymbolizerPath, Args, nullptr, Redirects);<br>
> -  if (RunResult != 0)<br>
> -    return false;<br>
> -<br>
> -  auto OutputBuf = MemoryBuffer::getFile(OutputFile.c_str());<br>
> -  if (!OutputBuf)<br>
> -    return false;<br>
> -  StringRef Output = OutputBuf.get()->getBuffer();<br>
> -  SmallVector<StringRef, 32> Lines;<br>
> -  Output.split(Lines, "\n");<br>
> -  auto CurLine = Lines.begin();<br>
> -  int frame_no = 0;<br>
> -  for (int i = 0; i < Depth; i++) {<br>
> -    if (!Modules[i]) {<br>
> -      OS << format("#%d %p\n", frame_no++, StackTrace[i]);<br>
> -      continue;<br>
> -    }<br>
> -    // Read pairs of lines (function name and file/line info) until we<br>
> -    // encounter empty line.<br>
> -    for (;;) {<br>
> -      if (CurLine == Lines.end())<br>
> -        return false;<br>
> -      StringRef FunctionName = *CurLine++;<br>
> -      if (FunctionName.empty())<br>
> -        break;<br>
> -      OS << format("#%d %p ", frame_no++, StackTrace[i]);<br>
> -      if (!FunctionName.startswith("??"))<br>
> -        OS << format("%s ", FunctionName.str().c_str());<br>
> -      if (CurLine == Lines.end())<br>
> -        return false;<br>
> -      StringRef FileLineInfo = *CurLine++;<br>
> -      if (!FileLineInfo.startswith("??"))<br>
> -        OS << format("%s", FileLineInfo.str().c_str());<br>
> -      else<br>
> -        OS << format("(%s+%p)", Modules[i], (void *)Offsets[i]);<br>
> -      OS << "\n";<br>
> -    }<br>
> -  }<br>
> -  return true;<br>
> -}<br>
> #endif // defined(HAVE_BACKTRACE) && defined(ENABLE_BACKTRACES)<br>
><br>
> // PrintStackTrace - In the case of a program crash or fault, print out a stack<br>
><br>
> Modified: llvm/trunk/lib/Support/Windows/Signals.inc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Signals.inc?rev=252118&r1=252117&r2=252118&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Signals.inc?rev=252118&r1=252117&r2=252118&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Support/Windows/Signals.inc (original)<br>
> +++ llvm/trunk/lib/Support/Windows/Signals.inc Wed Nov  4 19:07:54 2015<br>
> @@ -135,6 +135,10 @@ typedef BOOL (WINAPI *fpSymGetLineFromAd<br>
>                       PDWORD, PIMAGEHLP_LINE64);<br>
> static fpSymGetLineFromAddr64 fSymGetLineFromAddr64;<br>
><br>
> +typedef BOOL(WINAPI *fpSymGetModuleInfo64)(HANDLE hProcess, DWORD64 dwAddr,<br>
> +                                           PIMAGEHLP_MODULE64 ModuleInfo);<br>
> +static fpSymGetModuleInfo64 fSymGetModuleInfo64;<br>
> +<br>
> typedef PVOID (WINAPI *fpSymFunctionTableAccess64)(HANDLE, DWORD64);<br>
> static fpSymFunctionTableAccess64 fSymFunctionTableAccess64;<br>
><br>
> @@ -144,6 +148,9 @@ static fpSymSetOptions fSymSetOptions;<br>
> typedef BOOL (WINAPI *fpSymInitialize)(HANDLE, PCSTR, BOOL);<br>
> static fpSymInitialize fSymInitialize;<br>
><br>
> +typedef BOOL (WINAPI *fpEnumerateLoadedModules)(HANDLE,PENUMLOADED_MODULES_CALLBACK64,PVOID);<br>
> +static fpEnumerateLoadedModules fEnumerateLoadedModules;<br>
> +<br>
> static bool load64BitDebugHelp(void) {<br>
>   HMODULE hLib = ::LoadLibraryW(L"Dbghelp.dll");<br>
>   if (hLib) {<br>
> @@ -155,10 +162,14 @@ static bool load64BitDebugHelp(void) {<br>
>                       ::GetProcAddress(hLib, "SymGetSymFromAddr64");<br>
>     fSymGetLineFromAddr64 = (fpSymGetLineFromAddr64)<br>
>                       ::GetProcAddress(hLib, "SymGetLineFromAddr64");<br>
> +    fSymGetModuleInfo64 = (fpSymGetModuleInfo64)<br>
> +                      ::GetProcAddress(hLib, "SymGetModuleInfo64");<br>
>     fSymFunctionTableAccess64 = (fpSymFunctionTableAccess64)<br>
>                      ::GetProcAddress(hLib, "SymFunctionTableAccess64");<br>
>     fSymSetOptions = (fpSymSetOptions)::GetProcAddress(hLib, "SymSetOptions");<br>
>     fSymInitialize = (fpSymInitialize)::GetProcAddress(hLib, "SymInitialize");<br>
> +    fEnumerateLoadedModules = (fpEnumerateLoadedModules)<br>
> +      ::GetProcAddress(hLib, "EnumerateLoadedModules64");<br>
>   }<br>
>   return fStackWalk64 && fSymInitialize && fSymSetOptions;<br>
> }<br>
> @@ -183,23 +194,106 @@ static PTOP_LEVEL_EXCEPTION_FILTER OldFi<br>
> static CRITICAL_SECTION CriticalSection;<br>
> static bool CriticalSectionInitialized = false;<br>
><br>
> -static void PrintStackTraceForThread(llvm::raw_ostream &OS, HANDLE hProcess,<br>
> -                                     HANDLE hThread, STACKFRAME64 &StackFrame,<br>
> -                                     CONTEXT *Context) {<br>
> -  DWORD machineType;<br>
> +enum {<br>
> #if defined(_M_X64)<br>
> -  machineType = IMAGE_FILE_MACHINE_AMD64;<br>
> +  NativeMachineType = IMAGE_FILE_MACHINE_AMD64<br>
> #else<br>
> -  machineType = IMAGE_FILE_MACHINE_I386;<br>
> +  NativeMachineType = IMAGE_FILE_MACHINE_I386<br>
> #endif<br>
> +};<br>
> +<br>
> +static bool printStackTraceWithLLVMSymbolizer(llvm::raw_ostream &OS,<br>
> +                                              HANDLE hProcess, HANDLE hThread,<br>
> +                                              STACKFRAME64 &StackFrameOrig,<br>
> +                                              CONTEXT *ContextOrig) {<br>
> +  // StackWalk64 modifies the incoming stack frame and context, so copy them.<br>
> +  STACKFRAME64 StackFrame = StackFrameOrig;<br>
> +<br>
> +  // Copy the register context so that we don't modify it while we unwind. We<br>
> +  // could use InitializeContext + CopyContext, but that's only required to get<br>
> +  // at AVX registers, which typically aren't needed by StackWalk64. Reduce the<br>
> +  // flag set to indicate that there's less data.<br>
> +  CONTEXT Context = *ContextOrig;<br>
> +  Context.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;<br>
> +<br>
> +  static void *StackTrace[256];<br>
> +  int Depth = 0;<br>
> +  while (fStackWalk64(NativeMachineType, hProcess, hThread, &StackFrame,<br>
> +                      &Context, 0, fSymFunctionTableAccess64,<br>
> +                      fSymGetModuleBase64, 0)) {<br>
> +    if (StackFrame.AddrFrame.Offset == 0)<br>
> +      break;<br>
> +    StackTrace[Depth++] = (void *)(uintptr_t)StackFrame.AddrPC.Offset;<br>
> +    if (Depth >= array_lengthof(StackTrace))<br>
> +      break;<br>
> +  }<br>
><br>
> +  return printSymbolizedStackTrace(&StackTrace[0], Depth, OS);<br>
> +}<br>
> +<br>
> +namespace {<br>
> +struct FindModuleData {<br>
> +  void **StackTrace;<br>
> +  int Depth;<br>
> +  const char **Modules;<br>
> +  intptr_t *Offsets;<br>
> +  StringSaver *StrPool;<br>
> +};<br>
> +}<br>
> +<br>
> +static BOOL CALLBACK findModuleCallback(WIN32_ELMCB_PCSTR ModuleName,<br>
> +                                        DWORD64 ModuleBase, ULONG ModuleSize,<br>
> +                                        void *VoidData) {<br>
> +  FindModuleData *Data = (FindModuleData*)VoidData;<br>
> +  intptr_t Beg = ModuleBase;<br>
> +  intptr_t End = Beg + ModuleSize;<br>
> +  for (int I = 0; I < Data->Depth; I++) {<br>
> +    if (Data->Modules[I])<br>
> +      continue;<br>
> +    intptr_t Addr = (intptr_t)Data->StackTrace[I];<br>
> +    if (Beg <= Addr && Addr < End) {<br>
> +      Data->Modules[I] = Data->StrPool->save(ModuleName);<br>
> +      Data->Offsets[I] = Addr - Beg;<br>
> +    }<br>
> +  }<br>
> +  return TRUE;<br>
> +}<br>
> +<br>
> +static bool findModulesAndOffsets(void **StackTrace, int Depth,<br>
> +                                  const char **Modules, intptr_t *Offsets,<br>
> +                                  const char *MainExecutableName,<br>
> +                                  StringSaver &StrPool) {<br>
> +  if (!fEnumerateLoadedModules)<br>
> +    return false;<br>
> +  FindModuleData Data;<br>
> +  Data.StackTrace = StackTrace;<br>
> +  Data.Depth = Depth;<br>
> +  Data.Modules = Modules;<br>
> +  Data.Offsets = Offsets;<br>
> +  Data.StrPool = &StrPool;<br>
> +  fEnumerateLoadedModules(GetCurrentProcess(), findModuleCallback, &Data);<br>
> +  return true;<br>
> +}<br>
> +<br>
> +static void PrintStackTraceForThread(llvm::raw_ostream &OS, HANDLE hProcess,<br>
> +                                     HANDLE hThread, STACKFRAME64 &StackFrame,<br>
> +                                     CONTEXT *Context) {<br>
>   // Initialize the symbol handler.<br>
>   fSymSetOptions(SYMOPT_DEFERRED_LOADS | SYMOPT_LOAD_LINES);<br>
>   fSymInitialize(hProcess, NULL, TRUE);<br>
><br>
> +  // Try llvm-symbolizer first. llvm-symbolizer knows how to deal with both PDBs<br>
> +  // and DWARF, so it should do a good job regardless of what debug info or<br>
> +  // linker is in use.<br>
> +  if (printStackTraceWithLLVMSymbolizer(OS, hProcess, hThread, StackFrame,<br>
> +                                        Context)) {<br>
> +    return;<br>
> +  }<br>
> +<br>
>   while (true) {<br>
> -    if (!fStackWalk64(machineType, hProcess, hThread, &StackFrame, Context, 0,<br>
> -                      fSymFunctionTableAccess64, fSymGetModuleBase64, 0)) {<br>
> +    if (!fStackWalk64(NativeMachineType, hProcess, hThread, &StackFrame,<br>
> +                      Context, 0, fSymFunctionTableAccess64,<br>
> +                      fSymGetModuleBase64, 0)) {<br>
>       break;<br>
>     }<br>
><br>
> @@ -404,7 +498,6 @@ extern "C" VOID WINAPI RtlCaptureContext<br>
> #endif<br>
><br>
> void llvm::sys::PrintStackTrace(raw_ostream &OS) {<br>
> -<br>
>   STACKFRAME64 StackFrame = {};<br>
>   CONTEXT Context = {};<br>
>   ::RtlCaptureContext(&Context);<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
<br>
</div></div></blockquote></div><br></div>