Skip to content

Commit 3ee9614

Browse files
authored
Merge pull request #4600 from compnerd/symbolicate
Foundation: correct `Thread.callStackSymbols` on Windows
2 parents dc74daf + e78695f commit 3ee9614

File tree

1 file changed

+19
-17
lines changed

1 file changed

+19
-17
lines changed

Sources/Foundation/Thread.swift

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -391,26 +391,28 @@ open class Thread : NSObject {
391391
return backtraceAddresses { (addresses, count) in
392392
var symbols: [String] = []
393393

394-
let buffer: UnsafeMutablePointer<UInt8> =
395-
.allocate(capacity: MemoryLayout<SYMBOL_INFO>.size + 128)
396-
defer { buffer.deallocate() }
397-
398-
let pSymbolInfo =
399-
UnsafeMutableRawPointer(buffer).assumingMemoryBound(to: SYMBOL_INFO.self)
400-
pSymbolInfo.pointee.SizeOfStruct = ULONG(MemoryLayout<SYMBOL_INFO>.size)
401-
pSymbolInfo.pointee.MaxNameLen = 128
402-
403394
let addresses: UnsafeMutableBufferPointer<PVOID?> =
404395
UnsafeMutableBufferPointer<PVOID?>(start: addresses, count: count)
405-
for address in addresses {
406-
var dwDisplacement: DWORD64 = 0
407-
if SymFromAddr(hProcess, DWORD64(UInt(bitPattern: address)),
408-
&dwDisplacement, pSymbolInfo) {
409-
withUnsafePointer(to: pSymbolInfo.pointee.Name) {
410-
symbols.append(String(cString: $0))
396+
withUnsafeTemporaryAllocation(byteCount: MemoryLayout<SYMBOL_INFO>.size + 127,
397+
alignment: 8) { buffer in
398+
let pSymbolInfo: UnsafeMutablePointer<SYMBOL_INFO> =
399+
buffer.baseAddress!.assumingMemoryBound(to: SYMBOL_INFO.self)
400+
401+
for address in addresses {
402+
pSymbolInfo.pointe.SizeOfStruct =
403+
ULONG(MemoryLayout<SYMBOL_INFO>.size)
404+
pSymbolInfo.pointee.MaxNameLen = 128
405+
406+
var dwDisplacement: DWORD64 = 0
407+
if SymFromAddr(hProcess, DWORD64(UInt(bitPattern: address)),
408+
&dwDisplacement, &pSymbolInfo.pointee) {
409+
symbols.append(String(unsafeUninitializedCapacity: Int(pSymbolInfo.pointee.NameLen) + 1) {
410+
strncpy($0.baseAddress, &pSymbolInfo.pointee.Name, $0.count)
411+
return $0.count
412+
})
413+
} else {
414+
symbols.append("\(address)")
411415
}
412-
} else {
413-
symbols.append("\(pSymbolInfo.pointee)")
414416
}
415417
}
416418

0 commit comments

Comments
 (0)