Я работал с системой, которая предъявляла аналогичные требования (встроенное устройство ARM).Нам пришлось построить большую часть этого с нуля, но мы использовали для этого кое-что из CodeWarrior, а затем файл карты для поиска имени функции.
С CodeWarrior вы можете вставить некоторый код в начало иконец каждой функции, и, используя это, вы можете отслеживать, когда вы входите в каждую функцию, и когда вы переключаете потоки.Мы использовали сборку, и вам, возможно, придется также, но это проще, чем вы думаете.Один из ваших регистров будет вашим возвращаемым значением, которое является шестнадцатеричным значением.Если вы компилируете файл карты, вы можете использовать это шестнадцатеричное значение для поиска (искаженного) имени этой функции.Вы можете найти имя класса в имени функции.
Но, в принципе, получите себе поток куда-нибудь (в идеале на рабочий стол) и кричите в поток:
Введенная функция #####
Левая функция #####
Переключено на поток #
(PS - фактическое кодирование должно быть больше похоже на 1 21361987236, 2 1238721312, так как вы нена самом деле не хочу отправлять символы)
Если вы обрабатываете только один поток за раз, это должно дать вам точную запись о том, куда вы пошли, в том порядке, в котором вы туда ходили.Прикрепите информацию о тиках часов для профилирования функций, добавьте сообщение для выделения (и освобождения), и вы получите отслеживание памяти.
Если вы на самом деле запускаете несколько потоков, это может стать значительно сложнее или быть более одинаковым- Я не знаю.Я бы поместил информацию о времени во все, а затем выделил отдельный поток для каждого потока.Хотя вы можете просто определить, на каком процессоре вы работаете, и сообщить об этом, для какого потока ... Однако я не знаю, сработает ли что-то из этого.
Тем не менее,Основная идея заключалась в следующем: составьте отчет о каждом шаге (функция входа / выхода, переключение потоков и распределение), а затем повторно соберите информацию, которая вас интересует, на стороне рабочего стола, где у вас есть запасная обработка.