我想禁用在抛出异常时生成的堆栈跟踪.
我用过,
Runtime.getRuntime().traceInstructions(false); Runtime.getRuntime().traceMethodCalls(false);
但我仍然可以看到跟踪生成.你怎么能这样做?此外,我需要检测是否有人正在调试我的课程.
我想禁用所有异常跟踪.我不能使用混淆,因为我的产品是一个将用于开发的SDK.我还提供了一个Runtime,当人们想要部署使用我的SDK构建的应用程序时使用它.我的要求是任何使用我的Runtime jar的人都不应该能够调试编写的代码……或者至少我会通过避免从我的运行时jar生成堆栈跟踪来使调试变得困难.
我找到的一种方法是所有来自我的运行时jar的异常,我只是捕获它们并在异常对象上设置一个空的StackTraceElement数组并重新抛出它…
为何如此要求?
假设你使用我的SDK开发一个应用程序.(SDK jar不能与你的应用程序捆绑在一起..我已经限制了它,那就是最终:) !!)现在要在你客户端的机器上运行你的应用程序,你(或客户端)需要安装客户端计算机上的运行时并运行您的应用程序.现在,如果您的客户使用我的运行时罐子开始开发自己的应用程序,该怎么办这对我的生意构成威胁….这就是为什么这个可怕的要求.
为什么禁用堆栈跟踪?
通过禁用堆栈跟踪生成或方法调用跟踪生成我想用我的Runtime jar开发代码很困难,这就是为什么我以这种方式开始我的问题…建议一些其他解决方案来实现这样的要求……
一般而言,只有通过字节码检测(在加载时使用额外指令修改字节码),才能透明地分析任何Java代码.对这种分析的唯一已知防御(我假设您试图保持代码内部机密)是混淆.例如,参见 ProGuard .混淆将使堆栈跟踪对任何过度好奇的用户都无用(而且,遗憾的是,由于同样的原因,它也使调试变得非常困难).
翻译自:https://stackoverflow.com/questions/2317983/how-to-disable-stack-trace-generation-in-a-java-program