2012-10-02 2 views
4

Я хочу иметь что-то вроде этого:Как узнать код Java, если VM отлаживается?

long timeout = isDebugModeActive() ? Long.MAX_VALUE : 10000; 

Так что, когда отладчик останавливается на точке останова тайм-ауты не происходит.

Есть ли какие-либо свойства API или системы/среды, чтобы узнать это?

+0

Вы можете получить входные аргументы через JMX и проверить, включена ли отладка. –

+0

То, что я делал в прошлом, это создать таймер, который каждые 10 мс добавит 10 мс (приблизительный) к времени. При отладке этот таймер замедляется в зависимости от того, насколько сильно вы выполняете код, который вы делаете. В большинстве случаев это, вероятно, будет чрезмерным. ;) –

ответ

2

Автор this thread нашел это решение:

java.lang.management.ManagementFactory.getRuntimeMXBean(). 
getInputArguments().toString().indexOf("-agentlib:jdwp") > 0; 

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

+0

спасибо, что делает трюк –

1

Вы можете создать новую конфигурацию запуска (Run -> Run Configurations) и добавить туда переменную окружения или системное свойство.

+0

Спасибо. Это точно, как это работает в нашем проекте сейчас, но я думал, что могут быть некоторые более разумные альтернативы. –

+1

Maxium: [Сделайте простую вещь, которая могла бы работать] (http://c2.com/xp/DoTheSimplestThingThatCouldPossiblyWork.html) –

1

если вы разрабатываете RCP приложения, которое вы можете использовать:

if(Platform.inDevelopmentMode()) { 
    // .... 
} 
+0

Спасибо, но поскольку это «простое» приложение OSGi, значит, у нас нет ядра Eclipse классы доступны –

1

Можно путем проверки JVM аргументов, которые начали программу.

Там вы увидите:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=[port] 

Затем проверить это порт прослушивания или есть связи.

+0

это будет работать только для удаленных сеансов отладки. –

+0

отличная идея! по крайней мере, на linux мы можем сделать это из java-приложения 'ps -A -o pid, ppid, cmd | grep" java. * YourMainPackageName [.] YourMainClassName "-i | tr '' '\ n' | grep" [ -] Xdebug "' –

+0

ах ... еще лучше, просто java, проверяющие JVM-аргументы, которые вы сказали, могут быть сделаны с помощью этого совета: http://stackoverflow.com/a/1518250/1422630, я не знал, что это возможно, спасибо! –

Смежные вопросы