Как найти трассировку стека вызывающего потока с точки останова?

У меня есть поток в моем коде Android, и во время отладки мне нужно установить точку останова внутри потока. Однако, как только я нахожусь в точке останова внутри потока, я не могу видеть трассировку стека вызывающего потока. На этом этапе мне обычно нужно установить новую точку останова в вызывающем потоке и взять ее оттуда.

введите описание изображения здесь

Как вы можете видеть на изображении выше, трассировка стека в отладчике показывает run() как метод верхнего уровня. Как я могу двигаться вверх по трассировке стека или переключать потоки, чтобы увидеть start() и все, что было до него?

1 ответ

Решение

Вы не можете или не должны видеть трассировку стека первого потока, который создал другой поток. То, как это работает в многопоточности, каждый будет работать параллельно. Это может произойти, если первый поток вызывает создание второго потока, а затем продолжает выполнять другие методы или работу, в то время как ОС заботится о создании второго потока и запуске в определенное время (обычно как можно скорее) для выполнения некоторого выполнения. Второй поток будет содержать практически стековую трассировку, так как выполняется первый выполняемый метод. Он заполняется, когда код получает доступ к другим методам и очищает, когда он завершает / завершает методы, которые он выполнял. Отсюда и такой код:

Log.i("FirstThread", "creating secondThread");
Thread secondThread = new Thread(new Runnable() {
    @Override
    public void run() {
        Log.i("SecondThread", "run called");
    }
});
secondThread.start();
Log.i("FirstThread", "finished creating secondThread");

может закончиться со следующим журналом:

FirstThread: creating secondThread
FirstThread: finished creating secondThread
SecondThread: run called

Суть в том, что первый журнал всегда будет первым, так как после него создается второй поток потока, но второй и третий журналы могут переключаться в разное время и в разных испытаниях (один идет раньше другого, и наоборот). Это потому, что они работают параллельно, а ОС управляет временем запуска второго потока, а ресурсы для его выполнения выполняют.

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

Для этого просто щелкните правой кнопкой мыши точку разрыва, которую вы поместили в нить, включите Suspend и выберите All в качестве изображения ниже, затем нажмите Done:

Другие вопросы по тегам