// 在mono源代码层级中加如下两个api 可以获取堆栈字符串 这两个api我新加的,原来没有。基于原来的代码改的。

// add by bodong
#if PLATFORM_WIN32

__declspec(dllexport) GString* __stdcall mono_debugger_get_stacktrace(int depth)
{
GString* text = g_string_new();
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 = ;
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)-)
{
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释放内存。

Mono集成中使用api获取当前mono 调用堆栈的方法的更多相关文章

  1. tensorflow中的函数获取Tensor维度的两种方法:

    获取Tensor维度的两种方法: Tensor.get_shape() 返回TensorShape对象, 如果需要确定的数值而把TensorShape当作list使用,肯定是不行的. 需要调用Tens ...

  2. java中HttpServletRequest常用获取url、资源名等方法总结

    HttpServletRequest客户端获取请求,客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中.所以我们能够从对象中获取相应信息   端口 request.get ...

  3. ASP.NET MVC中在Action获取提交的表单数据方法总结 (4种方法,转载备忘)

    有Index视图如下: 视图代码如下: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Mas ...

  4. 数据库表中MAX ID获取,确保每次调用没有重复工具类(NumberUtil)

    下面这个类是获取数据库中一个字段的最大值.配置在数据库中. public class NoFactory { private final static Logger cLogger = Logger. ...

  5. ASP.NET MVC中在Action获取提交的表单数据方法

    有Index视图如下: 视图代码如下: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Mas ...

  6. 【Java EE 学习 29 下】【JDBC编程中操作Oracle数据库】【调用存储过程的方法】

    疑问:怎样判断存储过程执行之后返回值是否为空. 一.连接oracle数据库 1.需要的jar包:在安装的oracle中就有,所以不需要到官网下载,我的oracle11g下:D:\app\kdyzm\p ...

  7. Android反射出一个类中的其他类对象并调用其对应方法

    MainActivity如下: package cn.testreflect; import java.lang.reflect.Field; import java.lang.reflect.Met ...

  8. flask中cookie,session的存储,调用,删除 方法(代码demo)

    # -*- encoding: utf-8 -*- # cookie,session的存储,调用,删除 from flask import Flask,make_response,request,se ...

  9. WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常

    WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常 在wpf中封装Com组件时,调用组件 ...

随机推荐

  1. 系统UISearchController详解

    原文链接:https://www.jianshu.com/p/aa9a153a5b58

  2. iOS开发实战之搜索控制器UISearchController使用

    当tableView中的数据过多的时候,在tableView上加一个搜索框就变的很必要了,本文就讨论搜索控制器的使用,以及谓词的简单实现. .m文件中代码如下 添加搜索控制器的各种协议 <UIS ...

  3. 一站式搞定Ubuntu共享环境配置

    1. 添加linux用户 安装的开发用的虚拟机,一般不直接使用root账户,会新建一个普通用户,然后在/etc/sudoers添加上sudo的权限即可. 使用如下命令: sudo adduser -- ...

  4. 微信公众平台上如何上传excel表格?

    微信公众平台上如何上传excel表格?   我们都知道创建一个微信公众号,在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件. ...

  5. 思维导图概览SpringCloud

    @ 目录 1.什么是微服务 1.1.架构演进 1.2.微服务架构 1.3.微服务解决方案 2.SpringCloud概览 2.1.什么是SpringCloud 2.1.SpringCloud主要组件 ...

  6. Python 为什么要在 18 年前引入布尔类型?且与 C、C++ 和 Java 都不同?

    花下猫语:在上一篇<Python 为什么能支持任意的真值判断? >文章中,我们分析了 Python 在真值判断时的底层实现,可以看出 Python 在对待布尔值时,采用了比较宽泛的态度.官 ...

  7. HTML基础-02

    <header>网页头部              <hgroup>一个标题组 <main>网页主体                 <article> ...

  8. MySQL执行文件中的SQL

    连接进入MySQL服务, 使用source ${文件名}执行. 末尾不能带分号.

  9. Python爬取表结构数据---pandas快速获取

    例如: 此形式的表数据,可用pandas获取 首先获取table import requests from lxml import etree import pandas as pd url = 'h ...

  10. 一个简单的例子让你很轻松地明白JavaScript中apply、call、bind三者的用法及区别

    JavaScript中apply.call.bind三者的用法及区别 引言 正文 一.apply.call.bind的共同用法 二. apply 三. call 四. bind 五.其他应用场景 六. ...