Mono集成中使用api获取当前mono 调用堆栈的方法
// 在mono源代码层级中加如下两个api 可以获取堆栈字符串 这两个api我新加的,原来没有。基于原来的代码改的。
// add by bodong
#if PLATFORM_WIN32
__declspec(dllexport) GString* __stdcall mono_debugger_get_stacktrace(int depth) { GString* text = g_string_new(0); MonoDomain* domain = mono_domain_get(); MonoJitTlsData* jit_tls = TlsGetValue(mono_jit_tls_id); MonoLMF* lmf = mono_get_lmf(); MonoJitInfo* ji, rji; gint native_offset, il_offset; gboolean managed; MonoContext ctx, new_ctx; int count = 0; char* fname; MONO_INIT_CONTEXT_FROM_FUNC(&ctx, mono_debugger_get_stacktrace); MONO_ARCH_CONTEXT_DEF mono_arch_flush_register_windows(); while (MONO_CONTEXT_GET_SP(&ctx) < jit_tls->end_of_stack) { ji = mono_find_jit_info(domain, jit_tls, &rji, NULL, &ctx, &new_ctx, NULL, &lmf, &native_offset, &managed); g_assert(ji); if (ji == (gpointer)-1) { break; } fname = mono_method_full_name(ji->method, TRUE); g_string_append_printf(text, "%s\n", fname); g_free(fname); if (++count >= depth) { break; } ctx = new_ctx; } return text; } __declspec(dllexport) void __stdcall mono_debugger_free_stacktrace(GString* ptr) { if (ptr != NULL) { g_string_free(ptr, TRUE); } }
#endif
GString的定义如下:
typedef struct { char* str; size_t len; size_t allocated_len; } GString;
使用时只需要获取->str即可得到堆栈。用完后需要主动调用mono_debugger_free_stacktrace释放内存。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)