Java-программа ptrace с использованием C/C++
У меня есть проблема, аналогичная моей предыдущей, представленной здесь.
На этот раз я хочу использовать программу, написанную на c/ C++, для отслеживания выполнения JAVA-программы. Как я уже говорил ранее, тот же код, который отслеживает печать stdout для c/ C++ и регистрирует syscall 4, не сделал этого для JAVA. Я предполагаю, что это потому, что execlp, который я отслеживаю, используется только для запуска jvm. А потом создаются дополнительные процессы (по внутреннему механизму jvm), которые я не отслеживаю. Я нашел эту тему, которая кажется частичным решением. Если я правильно понял, каждый ребенок будет отслежен. Но это тоже проблема, я хочу отслеживать только тот процесс, который обрабатывает мое приложение, а не все остальные, которые может создать jvm. Есть ли шанс узнать, какой поток / процесс jvm обрабатывает мою программу, и отслеживать только это?
Для простоты предположим, что моя JAVA-программа однопоточная.
1 ответ
Если вы запустите двоичный файл через приложение трассировки, все потоки будут отслежены.
Но если вы присоединяетесь к процессу, вы не присоединяетесь ко всем его потокам. Вы должны присоединиться ко всем его потокам, используя потоки, которые вы можете найти в списке, например. в /proc/%d/task/.
Кроме того, я предлагаю прочитать исходный код Strace, я многому научился из него. Если вы можете использовать strace для успешного отслеживания потоков Java, как вы хотите, вы можете получить логику из этого.