You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:18:13