如何在Windows下查看加载Go DLL的C/C++应用内存dump完整调用栈
调试加载Go DLL的C/C++应用内存dump:如何查看完整Go调用栈?
实验环境与代码
Go DLL代码
package main import "C" import ( "fmt" "time" ) func funcB() { for { fmt.Println("funcB is looping...") time.Sleep(1 * time.Second) } } //export funcA func funcA() { funcB() } func main() { funcA() }
编译DLL命令
go build -o loop.dll -buildmode=c-shared loop.go lib /def:loop.def /out:loop.lib /machine:x64
C/C++加载应用代码
#include <iostream> #include "loop.h" int main() { funcA(); }
注:该C/C应用由MS Visual C编译,不兼容DWARF格式。
当前调试困境
通过任务管理器收集应用内存dump后,用WinDBG分析仅能看到C层函数调用,无法解析Go代码的栈信息,输出如下:
loop+0x6dca9 loop+0x6c02d ************ loop+0x98850 loop+0x988f2 loop+0x54f5 loop+0x51a5 loop+0x70d8e loop+0x6c1ec loop+0x7a137 loop!funcA+0x2f main+0x1009 main+0x1208
但将Go代码编译为独立可执行文件时,用Delve分析dump能正常查看完整调用栈:
(dlv) gr 1 Switched from 0 to 1 (thread 12548) (dlv) bt 0 0x00007ff60c3055ce in runtime.gopark at C:/Program Files/Go/src/runtime/proc.go:425 1 0x00007ff60c308577 in time.Sleep at C:/Program Files/Go/src/runtime/time.go:300 2 0x00007ff60c338912 in main.funcB at /go/mixtest/loop.go:18 3 0x00007ff60c338912 in main.funcA at /go/mixtest/loop.go:22 4 0x00007ff60c338912 in main.main at /go/mixtest/loop.go:31 5 0x00007ff60c2d753d in runtime.main at C:/Program Files/Go/src/runtime/proc.go:272 6 0x00007ff60c30c561 in runtime.goexit at C:/Program Files/Go/src/runtime/asm_amd64.s:1700
此外尝试用Ghidra打开dump,内置分析器未生效。查阅资料得知,Go代码链接到非Go程序存在局限性,Go运行时未完全集成导致调试困难,且现有资源多聚焦于Go嵌入C的场景,而非反向场景。
核心问题
调试加载Go DLL的C/C++应用内存dump时,是否有方法查看包含Go代码的完整调用栈?
内容的提问来源于stack exchange,提问作者pugnator
相关产品推荐
相关产品推荐

