이 보고서는 AddressSanitizer 보고서와 매우 유사합니다. AddressSanitizer 보고서와 다른 것은 거의 모든 HWASan 버그가 'tag-mismatch'라는 점입니다. 즉, 포인터 태그가 상응하는 메모리 태그와 일치하지 않는 메모리 액세스입니다. 원인은 다음 중 하나일 수 있습니다.
HWASan 보고서에는 다음과 같은 고급 디버깅 정보도 일부 포함되어 있습니다(순서대로).
프로세스의 스레드 목록
프로세스의 스레드 목록
오작동하는 메모리 근처의 메모리 태그 값
메모리 액세스 시점의 레지스터 덤프
메모리 태그 덤프
태그 메모리 덤프를 사용하면 포인터 태그와 태그가 동일한 근처의 메모리 할당을 찾을 수 있습니다. 큰 오프셋으로 범위를 벗어난 액세스를 가리킬 수 있습니다. 태그 1개는 메모리 16바이트에 해당합니다. 포인터 태그는 주소의 상위 8비트입니다. 태그 메모리 덤프는 힌트를 제공할 수 있습니다. 예를 들어 다음은 버퍼 오버플로(오른쪽)입니다.
tags: ad/5c (ptr/mem)
[...]
Memory tags around the buggy address (one tag corresponds to 16 bytes):
0x006f33ae1ff0: 0e 0e 0e 57 20 20 20 20 20 2e 5e 5e 5e 5e 5e b5
=>0x006f33ae2000: f6 f6 f6 f6 f6 4c ad ad ad ad ad ad [5c] 5c 5c 5c
0x006f33ae2010: 5c 04 2e 2e 2e 2e 2e 2f 66 66 66 66 66 80 6a 6a
Tags for short granules around the buggy address (one tag corresponds to 16 bytes):
0x006f33ae1ff0: ab 52 eb .. .. .. .. .. .. .. .. .. .. .. .. ..
=>0x006f33ae2000: .. .. .. .. .. .. .. .. .. .. .. .. [..] .. .. ..
0x006f33ae2010: .. 5c .. .. .. .. .. .. .. .. .. .. .. .. .. ..
(포인터 태그와 일치하는 왼쪽 'ad' 태그의 6 × 16 = 96바이트 실행입니다.)
할당 크기가 16의 배수가 아닌 경우 크기의 나머지는 메모리 태그로 저장되고 태그는 짧은 그래뉼 태그로 저장됩니다. 위의 예에서는 굵게 표시되어 있으며 할당 태그가 지정된 ad 바로 뒤에 태그 5c의 5 × 16 + 4 = 84바이트 할당이 있습니다.
0 메모리 태그(예: tags: ad/00 (ptr/mem))는 일반적으로 stack-use-after-return 버그를 나타냅니다.
레지스터 덤프
HWASan 보고서의 레지스터 덤프는 잘못된 메모리 액세스를 실행한 실제 명령에 해당합니다. 일반 Android 신호 핸들러의 또 다른 레지스터 덤프 ignore the second one이 뒤에 옵니다. 이 레지스터 덤프는 HWASan이 abort()를 호출할 때 표시되며 버그와는 관련이 없습니다.
기호화
참고: 조직에 기호화 프로세스의 일부 또는 전체를 자동화하는 도구가 있을 수 있습니다.
스택 트레이스에서 함수 이름과 줄 번호를 가져오고 use-after-scope 버그의 변수 이름을 가져오려면 오프라인 기호화 단계가 필요합니다.
최초 설정: llvm-symbolizer 설치
기호화하려면 시스템에 llvm-symbolizer가 설치되어 있고 $PATH에서 액세스할 수 있어야 합니다. Debian에서는 sudo apt install llvm을 사용하여 설치할 수 있습니다.
기호 파일 가져오기
기호화를 위해서는 기호가 포함된 제거되지 않은 바이너리가 필요합니다. 빌드 유형에 따라 찾을 수 있는 위치가 달라집니다.
로컬 빌드의 경우 기호 파일을 out/target/product/<product>/symbols/에서 찾을 수 있습니다.
AOSP 빌드(예: Flashstation에서 플래시됨)의 경우 빌드는 Android CI에서 찾을 수 있습니다. 빌드의 '아티팩트'에 `${PRODUCT}-symbols-${BUILDID}.zip` 파일이 있습니다.
참고: hwasan_symbolize 스크립트는 toolchains/llvm의 Android NDK에 있습니다.
스택 보고서 이해하기
스택 변수에서 발생하는 버그의 경우 HWASan 보고서에 다음과 같은 세부정보가 포함됩니다.
Cause: stack tag-mismatch
Address 0x007d4d251e80 is located in stack of thread T64
Thread: T64 0x0074000b2000 stack: [0x007d4d14c000,0x007d4d255cb0) sz: 1088688 tls: [0x007d4d255fc0,0x007d4d259000)
Previously allocated frames:
record_addr:0x7df7300c98 record:0x51ef007df3f70fb0 (/apex/com.android.art/lib64/libart.so+0x570fb0)
record_addr:0x7df7300c90 record:0x5200007df3cdab74 (/apex/com.android.art/lib64/libart.so+0x2dab74)
[...]
HWASan은 스택 버그를 파악할 수 있도록 과거에 발생한 스택 프레임을 추적합니다. 현재 HWASan은 버그 신고에서 사람이 읽을 수 있는 콘텐츠로 이를 변환하지 않기 때문에 추가 기호화 단계가 필요합니다.
문제 해결
'HWAddressSanitizer can not describe address in more detail.'
가끔 HWASan에서 이전 메모리 할당에 관한 정보를 저장할 공간이 부족할 수 있습니다. 이 경우 보고서에 즉시 메모리 액세스를 위한 스택 트레이스 하나만 포함되고 이어서 다음 메모가 표시됩니다.
HWAddressSanitizer can not describe address in more detail.
테스트를 여러 번 실행하면 이 문제가 해결되는 경우도 있습니다. 또 다른 옵션은 HWASan 기록 크기를 늘리는 것입니다. build/soong/cc/sanitize.go(hwasanGlobalOptions 찾기) 또는 프로세스 환경(adb shell echo $HWASAN_OPTIONS를 시도하여 현재 설정 확인하기)에서 전역적으로 실행할 수 있습니다.
'nested bug in the same thread'
이는 HWASan 비정상 종료 보고서를 생성하는 동안 버그가 발생했음을 의미합니다. 일반적으로 HWASan 런타임 내 버그로 인한 문제입니다. 버그를 신고하고 가능한 경우 문제를 재현하는 방법에 관한 설명을 제공해 주세요.