Как я могу записать, какой поток вызвал какую функцию из какого класса и в какое время на протяжении всего моего проекта? - PullRequest
1 голос
/ 29 июня 2010

Я работаю над довольно крупным проектом, который работает на встроенных системах.Я хотел бы добавить возможность регистрации, какой поток вызвал, какую функцию, из какого класса и в какое время.Например, вот как будет выглядеть типичная строка файла журнала:

Время - Имя потока - Имя функции - Имя класса

Я знаю, что могу сделать это с помощью функции ловушки _penter, которая будет выполняться в начале каждой функции, вызываемой в моем проекте (Источник: http://msdn.microsoft.com/en-us/library/c63a9b7h%28VS.80%29.aspx).. Затем я смог найти библиотеку, которая поможет мне найти функцию, класс и поток, из которого был вызван _penter. Однако яне может использовать это решение, поскольку оно специфично для VC ++.

Есть ли другой способ сделать это, который будет поддерживаться реализациями, не относящимися к VC ++? Я использую компилятор ARM / Thumb C / C ++, RVCT3.1.Кроме того, есть ли лучший способ отслеживания проблем, которые могут возникнуть из-за многопоточности?

Спасибо,

Борис

Ответы [ 3 ]

2 голосов
/ 29 июня 2010

Я работал с системой, которая предъявляла аналогичные требования (встроенное устройство ARM).Нам пришлось построить большую часть этого с нуля, но мы использовали для этого кое-что из CodeWarrior, а затем файл карты для поиска имени функции.

С CodeWarrior вы можете вставить некоторый код в начало иконец каждой функции, и, используя это, вы можете отслеживать, когда вы входите в каждую функцию, и когда вы переключаете потоки.Мы использовали сборку, и вам, возможно, придется также, но это проще, чем вы думаете.Один из ваших регистров будет вашим возвращаемым значением, которое является шестнадцатеричным значением.Если вы компилируете файл карты, вы можете использовать это шестнадцатеричное значение для поиска (искаженного) имени этой функции.Вы можете найти имя класса в имени функции.

Но, в принципе, получите себе поток куда-нибудь (в идеале на рабочий стол) и кричите в поток:

Введенная функция #####

Левая функция #####

Переключено на поток #

(PS - фактическое кодирование должно быть больше похоже на 1 21361987236, 2 1238721312, так как вы нена самом деле не хочу отправлять символы)

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

Если вы на самом деле запускаете несколько потоков, это может стать значительно сложнее или быть более одинаковым- Я не знаю.Я бы поместил информацию о времени во все, а затем выделил отдельный поток для каждого потока.Хотя вы можете просто определить, на каком процессоре вы работаете, и сообщить об этом, для какого потока ... Однако я не знаю, сработает ли что-то из этого.

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

1 голос
/ 30 июня 2010

Я написал несколько систем журналов, которые просто увеличивают # поток и сохраняют его в локальных данных потока.Это помогает с предоставлением потока операторов журнала.(время легко распечатать)

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

1 голос
/ 29 июня 2010

gcc имеет PRETTY_FUNCTION определение.Что касается потока, вы всегда можете позвонить gettid или аналогичный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...