使用 golang 时无法从 cgo 例程中使用核心文件获取堆栈跟踪

我正在使用 Golang 和 cgo。当我的 C 代码引发 . 时assert(),我无法在使用cgo.


相反,我看到了捕获断言的 golang 运行时的堆栈跟踪。


这是我的 C 代码示例


#include <stdio.h>

#include <pthread.h>

#include <assert.h>

#include <string.h>


void fn2(char *arg)

{

    int stackvar2 = 256;


    printf("Argument %s\n", arg);


    assert(1 == 2);

}


void fn1(int arg)

{

    int stackvar3 = 512;

    char var[256];


    strcpy(var, "deadbeef");


    fn2(var);

}



void *thread(void *arg)

{

    printf("Hello from the thread... going in for an assert\n");


    fn1(1092);


    return NULL;

}


void hello_world(char *str)

{

    pthread_t tid;


    printf("Hello World from C and here the str is from Go: %s\n", str);


    pthread_create(&tid, NULL, thread, NULL);


    sleep(100000);

}



Here is my Go code




package main


/*

extern void hello_world(char *str);

#cgo LDFLAGS: -L. -lhello

#cgo CFLAGS: -g3

*/

import "C"


import (

    _ "fmt"

)


func main() {

    str := "From Golang"


    cStr := C.CString(str)

    C.hello_world(cStr)


    select {}

}

这是我的 Makefile


all:

    gcc -g3 -O0 -c hello.c

    ar cru libhello.a hello.o

    go build hello.go


clean:

    rm -f *.o hello


慕斯709654
浏览 160回答 2
2回答

米脂

除了明显的检查之外ulimit -c,使用GOTRACEBACK=crash.&nbsp;这将打印出更多信息,并允许程序退出SIGABRT以触发核心转储。

冉冉说

实际上我需要将它添加到我的代码中:signal.Ignore(syscall.SIGABRT)。这让我可以看到崩溃的 C 代码的堆栈跟踪。
打开App,查看更多内容
随时随地看视频慕课网APP