| |
| |
| |
|
|
| package pprof |
|
|
| import ( |
| "errors" |
| "internal/syscall/windows" |
| "os" |
| "syscall" |
| ) |
|
|
| |
| func (b *profileBuilder) readMapping() { |
| snap, err := createModuleSnapshot() |
| if err != nil { |
| |
| b.addMappingEntry(0, 0, 0, "", "", true) |
| return |
| } |
| defer func() { _ = syscall.CloseHandle(snap) }() |
|
|
| var module windows.ModuleEntry32 |
| module.Size = uint32(windows.SizeofModuleEntry32) |
| err = windows.Module32First(snap, &module) |
| if err != nil { |
| |
| b.addMappingEntry(0, 0, 0, "", "", true) |
| return |
| } |
| for err == nil { |
| exe := syscall.UTF16ToString(module.ExePath[:]) |
| b.addMappingEntry( |
| uint64(module.ModBaseAddr), |
| uint64(module.ModBaseAddr)+uint64(module.ModBaseSize), |
| 0, |
| exe, |
| peBuildID(exe), |
| false, |
| ) |
| err = windows.Module32Next(snap, &module) |
| } |
| } |
|
|
| func readMainModuleMapping() (start, end uint64, exe, buildID string, err error) { |
| exe, err = os.Executable() |
| if err != nil { |
| return 0, 0, "", "", err |
| } |
| snap, err := createModuleSnapshot() |
| if err != nil { |
| return 0, 0, "", "", err |
| } |
| defer func() { _ = syscall.CloseHandle(snap) }() |
|
|
| var module windows.ModuleEntry32 |
| module.Size = uint32(windows.SizeofModuleEntry32) |
| err = windows.Module32First(snap, &module) |
| if err != nil { |
| return 0, 0, "", "", err |
| } |
|
|
| return uint64(module.ModBaseAddr), uint64(module.ModBaseAddr) + uint64(module.ModBaseSize), exe, peBuildID(exe), nil |
| } |
|
|
| func createModuleSnapshot() (syscall.Handle, error) { |
| for { |
| snap, err := syscall.CreateToolhelp32Snapshot(windows.TH32CS_SNAPMODULE|windows.TH32CS_SNAPMODULE32, uint32(syscall.Getpid())) |
| if errno, ok := errors.AsType[syscall.Errno](err); ok && errno == windows.ERROR_BAD_LENGTH { |
| |
| |
| continue |
| } |
| return snap, err |
| } |
| } |
|
|