Как отключить поколение отслеживания стека в программе Java?

Я хочу отключить отслеживание стека, сгенерированное, когда исключение выдается. Я использовал,

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

но тем не менее я видел, что трассировка была сгенерирована. Как можно сделать это? Также я должен обнаружить, отлаживает ли кто-то мой класс.

Я хочу отключить все трассировки исключения. Я не могу использовать путаницу, так как моим продуктом является SDK, который будет использоваться в разработке. Я предлагаю Время выполнения также, которое используется, когда люди хотят развернуться, их приложения создали использование моего SDK. Мое требование - то, что любой использующий мои банки Во время выполнения не должен мочь отладить код, который написан..., или по крайней мере я сделаю жестким отладить путем предотвращения поколения отслеживания стека от моих банок во время выполнения.

Один способ, которым я нашел, состоит в том, что все исключения, которые происходят из моих банок во время выполнения, я просто поймал бы их и установил бы пустой массив StackTraceElement на объекте исключения и повторно бросил бы его...

Почему такое требование? Предположим Вы разрабатывание приложения с помощью моего SDK. (Банки SDK не могут связанный Вашим приложением.. я ограничил его, и это является окончательным :)!!) Теперь для запуска приложения на машине клиента (или клиент) необходимо установить Время выполнения на машине клиента и запустить приложение. Теперь, что, если Ваш клиент начинает разрабатывать свои собственные приложения с помощью моих банок Во время выполнения!! Это - угроза моему бизнесу.... Вот почему ужасное требование.

Почему отключают отслеживание стека?
Путем отключения поколения отслеживания стека или вызова метода прослеживают поколение, я хотел сделать код разработки со своими банками Во время выполнения трудным, и вот почему я запустил, мой вопрос таким образом... предлагают некоторое другое решение достигнуть такого требования...

7
задан jschmier 11 March 2011 в 19:06
поделиться

4 ответа

Есть несколько сложных частей JVM (по крайней мере, реализация JVM Sun), которые не работают, если генерация трассировки стека отключена (я видел это в реализации некоторых методов поддержки отражения). Поэтому я не думаю, что генерацию трассировки стека вообще можно отключить. Методы Runtime.trace * () предназначены для чего-то другого (инструмент отладки гораздо более тщательный, чем трассировка стека).

В общем, любой Java-код может быть прозрачно проанализирован, хотя бы с помощью инструментария байт-кода (байт-код изменен дополнительными инструкциями при его загрузке). Единственная известная защита от такого анализа (я предполагаю, что вы пытаетесь сохранить конфиденциальность внутреннего кода) - это обфускация. См., Например, ProGuard . Обфускация сделает трассировку стека бесполезной для любого чрезмерно любознательного пользователя (и, к сожалению, по тем же причинам это также очень затруднит отладку).

2
ответ дан 6 December 2019 в 09:19
поделиться

При наличии группы ссылок , указывающих на ресурсы домена , лучший способ:

  • оставить urls как есть (со строкой запроса, например some/site? start = 4 & end = 10 )
  • добавьте класс к тем ссылкам, которые предоставляют крючок для javascript

    < a href = "".. class = "ajax" > Некоторые ресурсы

  • планируют, какой тип данных ответа они создадут (открытый текст, xml, JSON, html)
  • принять бэкэнд-решение , возвращать ли полную страницу или ответ на вызов ajax
  • таким образом, чтобы страницы оставались доступными

Например, в PHP можно легко просмотреть переменную $ _ SERVER и решить, возвращать ли полный ответ страницы или быть готовым к ответу ajax:

function isXmlHttpRequest()
{
    return isset( $_SERVER[ 'HTTP_X_REQUESTED_WITH' ] ) && 
        ($_SERVER[ 'HTTP_X_REQUESTED_WITH' ] == 'XMLHttpRequest');
}

Локальные ресурсы страницы

html как:

<a href="#first">First</a>
<a href="#second>Second</a>

<div id="first">lorem</div>
<div id="second">ipsum</div>

Вам не нужно ничего разбирать, все, что вам нужно сделать, это просто отобразить правильный div с id, который вы будете непосредственно взять от a [href] .. Это считается хорошей практикой, поскольку ваша страница остается доступной даже при выключенном JS.

-121--4518362-

Вероятно, вы всегда можете установить другую ассоциацию в реестре под HKCR. Но я особо не вижу смысла. PowerShell все равно не будет выполнять пакетные файлы; это совершенно другой язык.

-121--1948861-

Вы хотите отключить его для всех исключений?

Не зная, чего вы пытаетесь достичь, я бы сказал, что это неправильный путь, чтобы пойти вниз. Если вы ожидаете, что будет создано исключение, которое вы с удовольствием проигнорируете, вам следует явно поймать его и обработать (где обработка может означать просто игнорирование его или запись короткого сообщения без полной трассировки стека).

1
ответ дан 6 December 2019 в 09:19
поделиться

Мне также интересно, почему вы хотите это сделать, но если у вас действительно есть причины, у вас есть как минимум два варианта:

Если вы хотите отключить генерацию трассировки стека для ваших собственных реализаций исключений, вы можете просто переопределить метод fillInStackTrace:

public static class MyException extends Exception {
    @Override
    public Throwable fillInStackTrace() {
        return this;
    }       
}

Если вы хотите отключить его для всех исключений, вы можете использовать инструмент инструментария байтового кода для замены метод fillInStackTrace в классе Throwable. Однако это будет работать только для Java 6, поскольку вам в Java 5 не разрешено заменять собственный метод (fillInStackTrace) на метод Java с использованием инструментов.

11
ответ дан 6 December 2019 в 09:19
поделиться
  1. Я не думаю, что код может знать, что он отлаживается, за исключением косвенные (и ненадежные) средства вроде измерения времени, необходимого для выполнения кодовых последовательностей.

  2. Невозможно отключить все трассировки стека. Вы можете отключить трассировку строк для классов исключений, которые вы определяете самостоятельно, переопределив Throwable.fillInStackTrace () , чтобы ничего не делать. Но это не сработает для классов, которые вы определяете. невозможно изменить.

Но если вы думаете об этом, чтобы предотвратить реверс-инжиниринг, вы зря потратите время, даже если сможете это сделать. Хакеру будет несложно идентифицировать анти-реверсивный код вашего приложения и отредактировать соответствующие файлы байт-кода, чтобы отключить его.

РЕДАКТИРОВАТЬ - Я пересмотрел свое мнение о том, что вы пытаетесь сделать. Учитывая, что вы распространяете SDK, который, как вы ожидаете, ваши клиенты будут встраивать в свои собственные приложения, отключение трассировки стека для всего Java-приложения считается враждебным поведением клиентов , IMO. В качестве побочного эффекта защиты вашего «драгоценного» IP-адреса вы затрудняете отладку собственного кода заказчику / разработчику. Даже код, в стеке вызовов которого нет ваших драгоценных методов!

Если бы я был клиентом, я бы, вероятно, предпочел, чтобы вы отправляли запутанный код, чем это делать.Но, скорее всего, я бы ОЧЕНЬ СЛОЖНО попытался найти альтернативного поставщика программного обеспечения, который не рассматривал бы своих платежеспособных клиентов как воров .

5
ответ дан 6 December 2019 в 09:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: