Отладка: отслеживание (и различие) дерева вызовов функций двух версий одной и той же программы

Я работаю над переписыванием некоторых
код в строковой программе c ++ cmd.

я
изменил структуру данных низкого уровня, которая
он использует и новая версия проходит все
тесты (довольно много) без каких-либо
проблема, и я получаю правильный вывод
от новой и старой версии …
Тем не менее, когда дают определенный вклад, они дают
другое поведение.

Приступая к сути: быть немного
большой проект, я понятия не имею о
как отследить при исполнении
расход расходится, так что … есть ли способ отследить
дерево вызовов функций (возможно, исключая
STD звонки), а также, я не знаю, линия
номер в исходном файле и источнике
название?
Может быть, какой-то gcc или макрос кунг-фу?

Мне нужно решение для Linux, так как именно здесь запускается программа.

2

Решение

Тем не менее, когда дают определенный вклад, они дают другое поведение

Я бы расширил регистрацию в вашей старой и новой версиях, чтобы лучше понять работу ваших алгоритмов для certain input, Когда это станет яснее, вы можете, например, использовать gdb, если он вам все еще нужен.

Обновить

ОК, для меня логирование — это нормально, но вы не хотите его добавлять.

Другой метод отслеживания. На самом деле я использовал его только в Solaris, но вижу, что он существует и в Linux. Я не использовал его в Linux, так что это просто идея, которую вы можете проверить.

Ты можешь использовать SystemTap

Исследование пространства пользователя
Изначально SystemTap фокусировался на зондировании пространства ядра. Тем не менее, есть много случаев, когда исследование пространства пользователя может
помогите диагностировать проблему. SystemTap 0.6 добавлена ​​поддержка, чтобы позволить зондирование
процессы пользовательского пространства. SystemTap включает в себя поддержку для проверки записи
в и возвращение из функции в процессах пользовательского пространства, зондирование
предопределенные маркеры в коде пользовательского пространства и мониторинг пользовательского процесса
События.

Я могу гарантировать, что это сработает, но почему бы не попробовать?

В документе есть даже пример:

Если вы хотите увидеть, как вызывается функция xmalloc
с помощью команды ls вы можете использовать функции возврата в пользовательском пространстве для
предоставить эту информацию.

stap -d /bin/ls --ldd \
-e 'probe process("ls").function("xmalloc") {print_ustack(ubacktrace())}' \
-c "ls /"
0

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

Других решений пока нет …