Другая позиция резьбы

У меня в коде тупик, и я хочу его отладить.
По некоторым причинам я не могу восстановить это здесь. Проблема воссоздана только у моих клиентов.

Моя идея — опрашивать потоки раз в час и проверять, не застряли ли они в проблемном коде. Я знаю, что есть возможность напечатать текущую строку кода с __line__ а также __file__, Могу ли я сделать это в другой теме?

Например, в моем случае — я хочу, чтобы моя нить проверила другие нити и напечатала их текущую строку кода.

Редактировать — моя платформа RHEL 5.6 и код на C ++.

0

Решение

Возможно, есть некоторые причуды, но вот подход к этому

#include <iostream>
#include <string>

#define TRACK t.line = __LINE__; t.file=__FILE__;
struct Track
{
int line;
std::string file;
};

int main()
{
Track t;
TRACK int i = 0;
std::cout << t.file;
}

Вы можете добавить «TRACK» перед каждым оператором и получить доступ к объекту Track из другого потока, чтобы распечатать, где находится поток отслеживания.

1

Другие решения

Я обычно использую pstack когда я подозреваю это. Он не требует изменений кода и показывает состояние всех потоков в приложении. я бегу pstack несколько раз один за другим и сравните результаты.

1

Я бы порекомендовал придерживаться такой стратегии:

  • Определите, какие именно потоки создают тупик
  • Определите последний рабочий код этих потоков
  • Определите, почему между ними возникает тупик.

Затем, это зависит от используемой вами библиотеки потоков и платформы. Давайте предположим, что pthreads + linux pc.

  • Здесь вы можете вывести pthread_self () и временную метку, а затем проанализировать, что она застряла. Это изменит время так, что тупик может не возникнуть. В этом случае вы должны подумать, как это оптимизировать, чтобы не влиять на воспроизводимость (т.е. интегрировать вывод или собрать его внутри, а затем прочитать через отладчик или что-то еще)
  • Когда вы определили подозреваемых, перейдите к их реализации и найдите место, где они могут застрять, чтобы определить объект тупика.
  • Когда вы знаете потоки и объекты, вы должны проанализировать, как объект используется ими в динамике. Затем, сопоставив это динамическое поведение со свойствами объекта, вы узнаете, почему это происходит.
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector