如何在java程序中禁用堆栈跟踪生成?

我想禁用在抛出异常时生成的堆栈跟踪.

我用过,

Runtime.getRuntime().traceInstructions(false);
Runtime.getRuntime().traceMethodCalls(false);

但我仍然可以看到跟踪生成.你怎么能这样做?此外,我需要检测是否有人正在调试我的课程.

我想禁用所有异常跟踪.我不能使用混淆,因为我的产品是一个将用于开发的SDK.我还提供了一个Runtime,当人们想要部署使用我的SDK构建的应用程序时使用它.我的要求是任何使用我的Runtime jar的人都不应该能够调试编写的代码……或者至少我会通过避免从我的运行时jar生成堆栈跟踪来使调试变得困难.

我找到的一种方法是所有来自我的运行时jar的异常,我只是捕获它们并在异常对象上设置一个空的StackTraceElement数组并重新抛出它…

为何如此要求?

假设你使用我的SDK开发一个应用程序.(SDK jar不能与你的应用程序捆绑在一起..我已经限制了它,那就是最终:) !!)现在要在你客户端的机器上运行你的应用程序,你(或客户端)需要安装客户端计算机上的运行时并运行您的应用程序.现在,如果您的客户使用我的运行时罐子开始开发自己的应用程序,该怎么办这对我的生意构成威胁….这就是为什么这个可怕的要求.

为什么禁用堆栈跟踪?

通过禁用堆栈跟踪生成或方法调用跟踪生成我想用我的Runtime jar开发代码很困难,这就是为什么我以这种方式开始我的问题…建议一些其他解决方案来实现这样的要求……

如果禁用堆栈跟踪生成,JVM中有一些复杂的部分(至少是Sun的JVM实现)不起作用(我在实现一些反射支持方法时看到了这一点).所以我认为堆栈跟踪生成根本不能被禁用. Runtime.trace *()方法是关于其他东西的(调试工具比堆栈跟踪更彻底).

一般而言,只有通过字节码检测(在加载时使用额外指令修改字节码),才能透明地分析任何Java代码.对这种分析的唯一已知防御(我假设您试图保持代码内部机密)是混淆.例如,参见 ProGuard
.混淆将使堆栈跟踪对任何过度好奇的用户都无用(而且,遗憾的是,由于同样的原因,它也使调试变得非常困难).

翻译自:https://stackoverflow.com/questions/2317983/how-to-disable-stack-trace-generation-in-a-java-program

原文 

https://codeday.me/bug/20190113/527459.html

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 如何在java程序中禁用堆栈跟踪生成?

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址