转载

如何在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
正文到此结束
Loading...