![](/img/trans.png)
[英]VC2019 address sanitizer 64 bit link error on windows “unresolved external symbol __asan_shadow_memory_dynamic_address”
[英]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.exe
和msdia140.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.dll
的PATH
以確保正確的符號化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.