2010-01-27 3 views
10

Я пытаюсь использовать «strace -p» для присоединения к уже запущенному процессу JBoss. JBoss использует 1.5.0_15 Java JDK. К сожалению, это не работает - я только получить результат одного futex():
Невозможно «strace -p» на запущенном процессе JBoss

# strace -p 3388 
Process 3388 attached - interrupt to quit 
[ Process PID=3388 runs in 32 bit mode. ] 
futex(0x8f18f7c, FUTEX_WAIT_PRIVATE, 1, NULL <unfinished ...> 

Strace работает для всех других программ, но не JBoss. Кажется, он работает нормально, когда я запускаю процесс через strace. Он просто не работает, когда я пытаюсь подключиться к уже запущенному процессу.

Я использую 64-разрядную версию Linux 2.6.18 с 32-разрядным Java JDK (RedHat Enterprise Linux 5.3, если это имеет значение).

Update # 1:

Я попытался запустить его с «-d», но вывод не представляется быть более проницательным, по крайней мере, для меня:


[[email protected]]# strace -d -e verbose=all -p 3388 
Process 3388 attached - interrupt to quit 
[wait(0x137f) = 3388] 
pid 3388 stopped, [SIGSTOP] 
[wait(0x57f) = 3388] 
pid 3388 stopped, [SIGTRAP] 
[ Process PID=3388 runs in 32 bit mode. ] 
futex(0x8f18f7c, FUTEX_WAIT_PRIVATE, 1, NULL 
+0

принадлежит на суперпользователя? –

+0

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

+0

До сих пор я никогда не слышал о SuperUser, но чтобы избежать перекрестной публикации, я оставлю этот вопрос здесь. Я рассуждал, что большинство программистов J2EE использовали strace с JBoss –

ответ

11

Если в этом процессе есть несколько потоков, вам нужно указать strace несколько параметров -p, указав ID каждого из них. Похоже, вы успешно отслеживаете исходный родительский поток, и он ничего не делает, кроме как ждать окончания некоторых других потоков.

(Причина, по которой он работает при запуске команды от strace, заключается в том, что по умолчанию strace создает и обрабатывает новые дочерние процессы).

+0

I ' m фактически отслеживает дочерний поток. Хотя я попытался устранить родительский поток и дочерний поток, но я не стал дальше. Родительский поток отображал только вызов wait4(), как и следовало ожидать. –

+0

Вы уверены, что есть только одна дочерняя нить? Это немного подозрительно для процесса «java» (обратите внимание, что отдельные потоки по умолчанию не отображаются в 'ps'). Взгляните в '/ proc//task /'. – caf

+0

(Или попробуйте 'ps -eLm') – caf

0

У вас попробовал использовать strace -d -p NNN, чтобы получить отладочный вывод strace?

Может быть, добавить a-verbose?

Устанавливается ли strace setuid в корень, чтобы вы могли изучить любой процесс?

+0

Я попытался запустить его с помощью «-d», как отмечено в моем редактировании # 1 выше (я вижу, что форматирование не работает, как я ожидал в этом разделе) –

9

Может быть, вы можете попробовать это:

Трассирование -F -p PID

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