Есть ли способ измерить прошедшее время работы программы gdb
?
Посмотрите на это:
<------------bp---------------------------------->
Предположим, что мы отлаживаем файл и в каком-то случайном месте устанавливаем точку останова. Теперь gdb
мы что-то выполняем, а затем позволяем программе продолжить выполнение с помощью gdb
командной строки ( run
).
Мой вопрос здесь. Я хочу измерить прошедшее время с моментабппока программа не завершится успешно или не произойдет какая-либо ошибка.
Я предлагаю использовать .gdbinit
файл, и в этом файле вызывать некоторую функцию C для запуска таймера после run
команды, а в конце выполнения мы также вызываем gettime()
функцию C.
Итак, мой псевдокод немного похож на этот ( .gdbinit
файл):
break *0x8048452 (random place)
//start time
run
//get time
решение1
Самый простой способ сделать это (если ваш gdb поддерживает Python):
break *0xaddress
run
# target process is now stopped at breakpoint
python import time
python starttime=time.time()
continue
python print (time.time()-starttime)
Если ваш gdb не поддерживает Python, но может выполнять команды оболочки, то используйте это:
shell echo set \$starttime=$(date +%s.%N) > ~/gdbtmp
source ~/gdbtmp
continue
shell echo print $(date +%s.%N)-\$starttime > ~/gdbtmp
source ~/gdbtmp
В качестве альтернативы вы можете сделать вызов целевого процессаgettimeofdayиличасы_получитьвремя, но это гораздо более утомительно. Эти функции возвращают время, записывая в переменные в адресном пространстве процесса, которое вам, вероятно, пришлось бы выделить, вызвав что-то вроде malloc
, и это может не сработать, если ваша точка останова остановила программу в середине вызова другой malloc
или free
.
Однако небольшая проблема с этим решением заключается в том, что строки continue и print result должны запускаться сразу друг за другом, иначе синхронизация будет неточной. Мы можем решить эту проблему, поместив команды в готовый скрипт через "define". Если мы запустим define checkTime
, то gdb предложит нам ввести список команд. Просто введите любой из списков команд выше (python/shell), а затем вы сможете вызвать скрипт, просто используя команду checkTime
. Тогда синхронизация будет точной. Кроме того, вы можете поместить , define checkTime
а затем список команд в ./gdbinit
файл, чтобы вам не пришлось вручную переопределять его каждый раз при запуске новой программы.