Почему pstack намного быстрее, чем gdb, просто присоединяя, сохраняя стеки и выходя из него?

У меня есть скрипт, который запускает GDB с командным файлом, как это:

set logging file file_name
set logging on
thread apply all bt
q
y

Почему pstack намного быстрее, чем этот скрипт? Могу ли я как-нибудь добиться этой быстроты с помощью GDB?

РЕДАКТИРОВАТЬ: разница была версии GDB. Я использовал gdb-7.10, и на сброс следов стека ушло около 14 секунд. с gdb 7.0.1, которую использовал pstack, это заняло 2 сек. Большую часть времени занимал gdb-7.10 при загрузке символов из нашей библиотеки, и я не смог найти подходящую опцию для -readnever в новой версии.

1 ответ

Решение

По крайней мере, в моей системе pstack это сценарий оболочки, который запускает GDB, так что вы, вероятно, можете точно увидеть, что выполняется, просто посмотрев в pstack исполняемый файл.

Я подозреваю, что интересная часть сценария вполне может быть:

set width 0
set height 0
set pagination no

На самом деле set pagination no такой же как set height 0так что вы можете забыть set pagination no часть.

set height 0 а также set width 0 отключите любую попытку gdb для отображения вывода, перенесенного на ширину вашего терминала, и представленной страницы за раз.

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

Там не так много всего в pstack сценарий, который отличается от вашего сценария, поэтому я не вижу, что еще это может быть.

Другие вопросы по тегам