1) В разделе руководства, которое вы цитировали, говорится о BTS, а не о LBR: это не одно и то же. Позже в том же потоке , который вы цитировали, Энди Клин, кажется, указывает, что время привязки LBR на самом деле является моментом PMI (прерывания, которое запускает обработчик), а не моментом PEBS. Поэтому я думаю, что у всех трех стековых подходов есть одна и та же проблема.
2) Захваты стека DWARF точно не соответствуют записи PEBS. Событие PEBS записывается оборудованием во время выполнения, и только спустя некоторое время ЦП прерывается, и в этот момент стек разматывается. Если буфер PEBS сконфигурирован для хранения только одной записи, эти две вещи должны быть по крайней мере close , и если вам повезет, IP-адрес PEBS будет в той же функции , то есть все еще на вершине стека, когда запускается обработчик. В этом случае стек в основном правильный. Так как perf
показывает фактический IP-адрес PEBS сверху, а также кадры под кадром из захвата, в этом случае это работает.
3) Если вам не повезет, функция будет иметь изменился между захватом PEBS и запущенным обработчиком. В этом случае вы получаете стек Франкенса, который не имеет смысла: функция top может не вызываться из функции second from the top (или чего-то еще). Он не полностью поврежден: просто все, кроме верхнего кадра, происходит из точки после захвата стека PEBS, а верхний кадр - из PEBS, или что-то в этом роде. Это относится и к --call-graph fp
по тем же причинам.
Скорее всего, вы никогда не видели неверный IP, потому что perf
показывает IP из образца PEBS (это тема всей этой цепочки). Я думаю, что если вы посмотрите на необработанный пример, вы увидите как IP-адрес PEBS, так и IP-адрес обработчика, и вы увидите, что они обычно не совпадают.
В целом, вы можете доверять обратным следам в течение "времени" Профилирование "или" цикл ", поскольку они в некотором смысле являются точным представлением выборки времени выполнения: просто они не соответствуют моменту PEBS, но некоторое время спустя (но почему это позднее время хуже, чем время PEBS) , По сути, для такого типа профилирования вам вообще не нужен PEBS.
Если вы используете событие другого типа и хотите получить детальный отчет о том, где произошло событие, это то, чем является PEBS. за. Вам часто не требуется трассировка стека: достаточно только верхнего кадра. Если вам нужны стековые трассировки, используйте их, но знайте, что они появляются позже, или используйте --lbr (if that works)
.