Вот минимальный пример того, что я экспериментирую с:
Код: Выделить всё
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()
}
Код: Выделить всё
go build -o loop.dll -buildmode=c-shared loop.go
lib /def:loop.def /out:loop.lib /machine:x64
< /code>
c Приложение Загрузка DLL: < /p>
#include
#include "loop.h"
int main() {
funcA();
}
Проблема:
Я хочу увидеть полный стек вызовов, включая код Golang.
Я собрал дамп с помощью диспетчера задач и проверил его в 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
(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
< /code>
Я также попытался открыть дамп с Ghidra, но его встроенные анализаторы не помог Код в программы без холмов.
кажется, что время выполнения GO не полностью интегрировано в такие случаи, что делает отладку сложной. >
Вопрос: < /p>
Есть ли способ осмотреть полный Callstack, включая код GO, при отладке дампа памяти приложения C /C ++, который загружает Go Dll?
Подробнее здесь: https://stackoverflow.com/questions/793 ... o-dll-buil
Мобильная версия