簡體   English   中英

VC2019 地址清理器無符號堆棧跟蹤 64 位

[英]VC2019 address sanitizer no symbolic stack trace 64bit

下面的簡單程序

#include <malloc.h>
int main(int argc, char **argv)
{
    char* arr=malloc(10);
    arr[10]='\0';
    return 0;
}

在 32 位和 64 位動態鏈接中使用 VC2019 16.8.2 構建良好,但是我只在 32 位中獲得帶有符號的堆棧跟蹤。

32 位:堆棧打印有 function 個名稱(主要)

@echo off
rem small sample how to build a sample c prog with asan 32bit and the good stack trace
del /q *.pdb *.obj *.exe
cl -c -Zi -DDEBUG -D_DEBUG -DEBUG -MD -fsanitize=address -Fo:xx.obj xx.c
link /incremental:no /DEBUG:FULL /OUT:xx.exe /wholearchive:clang_rt.asan_dynamic-i386.lib /wholearchive:clang_rt.asan_dynamic_runtime_thunk-i386.lib xx.obj
xx.exe

>build_xx_32.bat
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29336 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

xx.c
Microsoft (R) Incremental Linker Version 14.28.29336.0
Copyright (C) Microsoft Corporation.  All rights reserved.

=================================================================
==5284==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x02c0075a at pc 0x00361060 bp 0x010ff7fc sp 0x010ff7f0
WRITE of size 1 at 0x02c0075a thread T0
    #0 0x36105f in main C:\Users\leo\w\gdc\misc\testprograms\asan\xx.c:5
    #1 0x3616c9 in _scrt_common_main_seh d:\agent\_work\57\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288
    #2 0x760ffa28  (C:\windows\System32\KERNEL32.DLL+0x6b81fa28)
    #3 0x77cc75f3  (C:\windows\SYSTEM32\ntdll.dll+0x4b2e75f3)
    #4 0x77cc75c3  (C:\windows\SYSTEM32\ntdll.dll+0x4b2e75c3)

64 位:堆棧僅使用十六進制地址值打印。

@echo off
rem 64bit: no symbolication of the call stack
del /q *.pdb *.obj *.exe
cl -c -Zi  -DDEBUG -D_DEBUG -DEBUG -MD -fsanitize=address -Fo:xx.obj xx.c
link /incremental:no /DEBUG:FULL /OUT:xx.exe /wholearchive:clang_rt.asan_dynamic-x86_64.lib /wholearchive:clang_rt.asan_dynamic_runtime_thunk-x86_64.lib xx.obj
xx.exe

> build_xx_64.bat
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29336 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

xx.c
Microsoft (R) Incremental Linker Version 14.28.29336.0
Copyright (C) Microsoft Corporation.  All rights reserved.

=================================================================
==9804==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x11d16408003a at pc 0x7ff6038d107d bp 0x000892dafd30 sp 0x000892dafd38
WRITE of size 1 at 0x11d16408003a thread T0
    #0 0x7ff6038d107c  (C:\Users\leo\w\gdc\misc\testprograms\asan\xx.exe+0x14000107c)
    #1 0x7ff6038d17df  (C:\Users\leo\w\gdc\misc\testprograms\asan\xx.exe+0x1400017df)
    #2 0x7ffd5d137033  (C:\windows\System32\KERNEL32.DLL+0x180017033)
    #3 0x7ffd5ddbd0d0  (C:\windows\SYSTEM32\ntdll.dll+0x18004d0d0)

任何線索為什么 64 位不同?

問題是我沒有調用vcvars64.bat ( C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat )

我確實手動設置了所有庫路徑,也確實將PATH設置為llvm-symbolizer.exe (位於C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\HostX64\x64 )但顯然clang_rt.asan_dynamic ... 庫似乎在查看另一個環境變量來執行符號化。

經過反復試驗后發現,對於 64 位,符號化在PATH額外查找並搜索msdia140.dll (位於C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Performance Tools\x64中我的 VC 安裝)。

總結就是PATH需要指向包含llvm-symbolizer.exemsdia140.dll的目錄才能讓符號器正常工作。

第二個解決方案:我發現還可以使用環境變量ASAN_SYMBOLIZER_PATH覆蓋llvm-symbolizer.exe的位置(此變量未在 vcvars64.bat 調用鏈中設置)。 這會覆蓋在PATH中找到的位置。

set ASAN_SYMBOLIZER_PATH=C:\Users\leo\llvm-symbolizer.exe將設置自定義符號器:請注意名稱必須llvm-symbolizer.exe

ASAN_SYMBOLIZER_PATH也可以指向目錄名稱而不是可執行文件(運行時嘗試在此目錄中找到llvm-symbolizer.exe )。

並且:仍然需要msdia140.dllPATH以確保正確的符號化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM