如何使用附加信息(如参数)在java中创建自定义堆栈跟踪?

2023-12-23

我被分配了一项任务来创建自定义堆栈跟踪,例如某些指定函数的输出到日志文件,但我不仅需要使用类和方法名称,还必须输出参数及其值。

这应该是一个单独的 jar,可以在任何 java 项目上运行。

我什至不知道这样的事情是否可能,更不用说从哪里开始了。 任何帮助,将不胜感激。


编辑:还有其他库可以使用本机 VM api 来实现此目的:https://github.com/cretz/stackparam https://github.com/cretz/stackparam它还修改 Throwable 类以始终打印修改后的堆栈跟踪。

我能想到的唯一可能的方法是使用代理和工具化,但是代理需要添加到启动命令行中。
然后,我将使用 ASM 库注册转换器来转换每个类(请记住,一些基本的 java 类可能已经加载),并将代码添加到每个方法调用的开头,以手动跟踪每个方法类并将其传递给我的库来跟踪它们:

// note that parameters names might not exist in runtime if code was compiled without a flag to include them.
public void doSomething(String name, int something) {
    MyLib.enterMethod(ThisClass.class, new MethodSignature(void.class, String.class, int.class), new Argument("name", name), new Argument("something", something));
    try {
        // original code
    } finally { // so we don't need to care about return in the middle of original code or exceptions
        MyLib.exitMethod();
    }
}

enterMethod会将调用帧添加到某个队列中并且exitMethod将删除最后添加的帧。请注意,每个线程应该有单独的队列,使用一些Map<Thread, MyFrame> or ThreadLocal对线程使用一些弱引用可能是个好主意。

然后您可以使用该队列中的帧来创建自己的堆栈跟踪。
但是这样做可能会大大降低性能 - 不仅仅是因为此代码的成本,而是将其添加到每个 setter/getter 可能会导致该方法永远不会被内联并进一步影响性能。

所以这是可能的,但我真的不建议这样做。
另外,其他库添加的一些其他转换器可能会影响结果,最好将您的堆栈跟踪与原始堆栈跟踪进行比较,以找到您未转换的任何丢失的方法(例如本机方法),并将它们添加到您的堆栈跟踪中,但没有该方法附加数据。

如果您确实也需要支持本机方法 - 那么您可以创建更高级的转换器来添加enterMethod/exitMethod调用本机方法之前和之后。

另外,如果这仅用于调试,您可以使用调试 API,因此它只能用作调试器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用附加信息(如参数)在java中创建自定义堆栈跟踪? 的相关文章

  • java 拖放

    我尝试熟悉java中的拖放 但我发现的所有教程都是 让我生气 我想要的只是从 JList 包含在名为 UserPanel 的自制 JPanel 中 拖动 PublicUserLabel 并将其放入从 JTabbedPanel 继承的自制类中
  • 如何重复一段文本中的每个字母?爪哇语

    就像在口吃中一样 如果文本为 dean 并且乘数为 3 则结果将是 dddeeeaaannn 由提供的乘数指定的次数 public static void repeatLetters String text dean int n 3 Str
  • ZeroDateTimeBehavior=convertToNull 在使用 hibernate 的 jdbc url 中不起作用

    通过 extern 属性文件 url 指定如下 jdbc mariadb xxxxx 3306 xxxxx zeroDateTimeBehavior convertToNull 连接工作正常并且能够查询数据库 通过休眠 我创建了一个映射到带
  • 清空变量不会使方法引用无效[重复]

    这个问题在这里已经有答案了 为什么代码不抛出NullPointerException当我使用与变量绑定的方法引用时dog我后来分配了null to 我正在使用 Java 8 import java util function Functio
  • 当前平台不支持桌面 API

    我遇到过这个错误 java lang UnsupportedOperationException 当前平台不支持桌面 API 我将从我的 java 应用程序中打开一个文件 我用这个方法 Desktop getDesktop open new
  • Spring 从 JBoss 上下文加载 PropertySourcesPlaceholderConfigurer

    我有一个使用 PropertySourcesPlaceholderConfigurer 的 spring 3 1 应用程序加载设置 我想管理测试和生产环境 只需从服务器上下文加载设置覆盖本地文件属性中指定的设置 下一个示例在 Tomcat
  • 如何检查单词是否在wordNet中

    我开始了解wordNet直到我知道我找到了synonymous对于一个特定的词 现在我有一个文件 我想使用标记化该文本n gram例如 String s I like to wear tee shirt 使用后n gram这将是 I lik
  • 扩展多个类

    我知道 Java 不支持多重继承 因为不允许扩展多个类 我只是想知道我的问题是否有解决方法 我有一个名为CustomAction需要扩展两个抽象类 BaseAction and QuoteBaseAction 我无法更改这些抽象类中的任何一
  • 从字符串中删除重音符号

    Android 中有没有什么方法 据我所知 没有 java text Normalizer 可以从字符串中删除任何重音 例如 变成 eau 如果可能的话 我想避免解析字符串来检查每个字符 java text NormalizerAndroi
  • java绕中心旋转矩形

    我想围绕其中心点旋转一个矩形 它应该保留在应该绘制的位置并在该空间中旋转 这是我的代码 AffineTransform transform new AffineTransform transform rotate Math toRadian
  • 如何获取 JDBC 中 UPDATE 查询影响的所有行?

    我有一项任务需要使用更新记录PreparedStatement 一旦记录被更新 我们知道更新查询返回计数 即受影响的行数 但是 我想要的不是计数 而是受更新查询影响的行作为响应 或者至少是受影响的行的 id 值列表 这是我的更新查询 UPD
  • Spring Security 角色层次结构不适用于 Thymeleaf sec:authorize

    我正在使用 Spring Security 3 2 5 RELEASE 和 ThymeLeaf 2 1 4 RELEASE 我已经在安全上下文中定义了角色层次结构 在我的视图层中我正在使用sec authorize属性来定义菜单项 我希望看
  • Hybris:如何在impex中导入zip文件中的媒体?

    我知道我们可以导入未像这样压缩的图像 siteResource jar com project initialdata constants ProjectInitialDataConstants projectinitialdata imp
  • 向Java类库添加函数

    我使用的 Java 类库在很多方面都不完整 有很多类我认为应该内置其他成员函数 但是 我不确定添加这些成员函数的最佳实践 让我们调用不足的基类A class A public A long arbitrary arguments publi
  • 难以理解 通配符

    我有一个非常基本的问题 下面的代码无法编译 假设 Apple Extends Fruit List
  • 假布尔值=真?

    我在一本书中找到了这段代码 并在 Netbeans 中执行了它 boolean b false if b true System out println true else System out println false 我只是不明白为什
  • Axis2 的 wsdl2java 在 RPC/Encoded 样式 Web 服务上失败

    Axis2 有替代方案吗 或者让它工作的方式 例如不同的数据绑定 Retrieving document at Exception in thread main org apache axis2 wsdl codegen CodeGener
  • JPA ManyToMany 产生的空联接表

    我有一个应用程序 其中我尝试使用 Hibernate 作为 JPA 提供程序来实现两个实体之间的多对多关系 我正在尝试的例子是一个单向的 其中一个相机可以有多个镜头 而镜头可以安装到多个相机中 以下是我的实体类 只需粘贴其中的相关部分 Ca
  • Graphics2D setfont() 严重减慢了 java 应用程序的启动速度

    我正在用java制作一个游戏 它每秒刷新60次 每次执行循环时 我都会使用 g2d 来绘制图像和字符串 如果我这样做的话一切都会很好g2d setFont new Font Arial Font PLAIN 8 和抽绳 这将是正常的 但如果
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所

随机推荐

  • 将非托管 C++ 方法传递给 C# dll 进行回调

    我有一个已注册的 Net dll 并且能够从我的 C 代码中调用方法 我基本上遵循了这个教程 http support microsoft com kb 828736 http support microsoft com kb 828736
  • Rails:如何显示用户的“上次查看时间”?

    我正在使用 device which storecurrent sign in at and last sign in at日期时间 但是假设用户一个月前登录 但上次查看页面是在 5 分钟前 有什么办法可以显示 用户最后一次出现是在 5 分
  • Erlang Mnesia - 非法记录信息

    我试图有一个函数来确保我需要的表已经创建 如果没有创建它 这是示例 ensure table exists Table MnesiaTables Nodes gt case lists member Table MnesiaTables o
  • 当 .proj 文件发生更改时,有什么方法可以让 Visual Studio 重新加载所有项目吗?

    如果我在 Visual Studio 打开并且许多项目文件已更改 但不是解决方案文件 时执行 svn 更新 则每次都必须等待并在重新加载项目对话框上单击 是 有时这可能需要一段时间 具体取决于已更改的项目数量以及我的电脑的运行速度 有没有办
  • 如何使用 Gradle 排除 Kotlin 文件编译

    对于 Java 我们这样排除 java srcDir src exclude myTests 我想用 Kotlin 做同样的事情 我试图在配置 Kotlin 的官方文档中找到一些关于此的文档 但没有成功 我所期望和已经尝试过的 当然没有任何
  • 如何从另一个组件打开反应引导模式对话框

    我学习反应并且有这个反应引导 https react bootstrap github io components modal 模态对话框 我想知道如何在另一个组件中使用它 这是该页面的示例 组件直接处理它的自打开 关闭对话框 functi
  • 防火墙上需要哪些开放端口才能允许 salt-stack 远程执行?

    saltstack 上的文档似乎不清楚 salt master gt salt minion 需要哪些端口 显然不需要 它建议只需要从 salt minion gt salt master 打开端口 看 http docs saltstac
  • yyerror 的 Bison 冲突类型

    我试图用 flex 和 bison 制作一个计算器 但在编译过程中发现了一个错误 这是错误 C GnuWin32 src gt gcc lex yy c y tab c o tugas tugas y 51 error conflictin
  • 如何在打字稿中显示按钮点击验证

    我想显示对空字段的验证 为此我使用了以下方法 但它不起作用 任何人都可以建议我提供帮助吗 谢谢 我的模板
  • Objective-C 中的 MAXFLOAT

    最大浮动定义为 math h define MAXFLOAT 0x1 fffffep 127f 我有点难过我以前从未注意到这一点 这实际上说的是什么呢 我本来期望这样的事情 define MAXFLOAT 0xFFFFFFFF 1 这还能用
  • 将 perl 脚本转换为 vba

    我使用的 PC 不允许使用 perl 脚本 有没有什么工具可以将perl脚本转换为vba宏 或者是否有任何链接可以让我们获得 perl 语句的 vba 等效项 假设您可以访问一台可以运行 Perl 的机器 您可以尝试使用PAR Packer
  • 如何在 PHP 中抽象 mysqli 准备好的语句?

    我正在使用自己的类进行数据库查询 扩展 mysqli class iDatabase extends mysqli public errorMsg private totalQueries private stmt public funct
  • 在 odoo v9 中关闭向导后显示成功消息

    在 odoo 9 中关闭向导后显示成功消息的最佳解决方案是什么 右上角有小弹出窗口吗 这不是您问题的正确答案 但我遇到了同样的问题 问题是当用户单击向导上的提交按钮时 我必须显示 成功提交 消息 我已经这样做了作为我的解决方案 我已经做到了
  • 验证服务帐户以使用 JavaScript 客户端库调用 Google API

    我要实现JSON RPC从 localhost WAMP 环境 调用Google 融合表 API https developers google com fusiontables docs v2 getting started 以及其他一些
  • TinkerPop 中的 next() 意味着什么

    我目前正在阅读 TinkerPop3文档 http tinkerpop incubator apache org docs 3 0 1 incubating 我感到困惑的是我找不到任何解释next 例如 with next 或 w o ne
  • HBase 和 Hadoop/HDFS 的区别

    这是一个幼稚的问题 但我是 NoSQL 范式的新手 对此了解不多 因此 如果有人可以帮助我清楚地理解 HBase 和 Hadoop 之间的区别 或者给出一些可能帮助我理解区别的指示 到目前为止 我做了一些研究和记录 据我了解 Hadoop
  • Jooq 支持 Joda-Time 吗?

    我们正在寻找不同时区的日期时间支持 Hibernate 似乎支持 Joda 时间 不知道 JOOQ 是否也支持 jOOQ http www jooq org本身不支持 Joda Time 或任何其他第三方数据类型 但您可以轻松配置 jOOQ
  • 是否可以使用 INSERT 命令将数据插入到表的中间部分?

    例子 索引 一些数据 1 一些 数据1 3 一些数据3 4 一些 数据4 5 一些 数据5 我想做一个 INSERT 来添加 gt 2 一些 数据2 有没有 SQL 命令或某种方法可以做到这一点 edit 好的 也许如果我解释我想要完成的每
  • Eclipse 错误:未绑定类路径容器

    我制作项目后收到两条错误消息 在解决构建路径错误之前 无法构建项目 未绑定的类路径容器 项目 method test 中的 JRE 系统库 OSGi Minimum 1 2 我认为如果我弄清楚第二个错误 第一个错误就会消失 但是 我在 10
  • 如何使用附加信息(如参数)在java中创建自定义堆栈跟踪?

    我被分配了一项任务来创建自定义堆栈跟踪 例如某些指定函数的输出到日志文件 但我不仅需要使用类和方法名称 还必须输出参数及其值 这应该是一个单独的 jar 可以在任何 java 项目上运行 我什至不知道这样的事情是否可能 更不用说从哪里开始了