Как проверить стек вызовов в дампе памяти приложения C/C++ с помощью Go DLL (buildmode=c-shared) в Windows?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как проверить стек вызовов в дампе памяти приложения C/C++ с помощью Go DLL (buildmode=c-shared) в Windows?

Сообщение Anonymous »

Я пытаюсь осмотреть полный дамп памяти, собранную на машине Windows, где go dll загружается в приложение C/c ++.
Вот минимальный пример того, что я экспериментирую с:

Код: Выделить всё

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
< /code>
c Приложение Загрузка DLL: < /p>
#include 
#include "loop.h"

int main() {
funcA();
}
Приложение C скомпилировано с использованием MS Visual C++, который не совместим с DWARF.
Проблема:
Я хочу увидеть полный стек вызовов, включая код 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
Если я создаю код Go как отдельный исполняемый файл, проверка дампа работает нормально с помощью Delve:
(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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»