diff --git a/c/debug/_demo/funcinfo/main.go b/c/debug/_demo/funcinfo/main.go new file mode 100644 index 000000000..8b0d9a913 --- /dev/null +++ b/c/debug/_demo/funcinfo/main.go @@ -0,0 +1,27 @@ +package main + +import ( + "github.com/goplus/llgo/c" + "github.com/goplus/llgo/c/debug" +) + +type T struct { + n int +} + +func (t *T) Demo() { + println(t.n) + addr := debug.Address() + c.Printf(c.Str("addr:0x%x\n"), addr) + var info debug.Info + r := debug.Addrinfo(addr, &info) + if r == 0 { + panic("not found info") + } + c.Printf(c.Str("func file:%s name:%s base:0x%x addr:0x%x\n"), info.Fname, info.Sname, info.Fbase, info.Saddr) +} + +func main() { + t := &T{100} + t.Demo() +} diff --git a/c/debug/_wrap/debug.c b/c/debug/_wrap/debug.c new file mode 100644 index 000000000..7c7859195 --- /dev/null +++ b/c/debug/_wrap/debug.c @@ -0,0 +1,14 @@ +#if defined(__linux__) +#define _GNU_SOURCE +#include +#endif + +#include + +void *llgo_address() { + return __builtin_return_address(0); +} + +int llgo_addrinfo(void *addr, Dl_info *info) { + return dladdr(addr, info); +} diff --git a/c/debug/debug.go b/c/debug/debug.go new file mode 100644 index 000000000..8170e3731 --- /dev/null +++ b/c/debug/debug.go @@ -0,0 +1,25 @@ +package debug + +import ( + "unsafe" + + "github.com/goplus/llgo/c" +) + +const ( + LLGoPackage = "link" + LLGoFiles = "_wrap/debug.c" +) + +type Info struct { + Fname *c.Char + Fbase c.Pointer + Sname *c.Char + Saddr c.Pointer +} + +//go:linkname Address C.llgo_address +func Address() unsafe.Pointer + +//go:linkname Addrinfo C.llgo_addrinfo +func Addrinfo(addr unsafe.Pointer, info *Info) c.Int