Профилировщику все равно, будете ли вы создавать код в режиме выпуска или отладки.Какой бы код ни выдавался, он будет его профилировать.Основная цель профилирования состоит в том, чтобы измерить различные метрики, связанные с производительностью, и найти узкие места.Таким образом, профилировщик спроектирован так, чтобы быть минимально навязчивым, чтобы иметь возможность проводить достаточно точные измерения.Как правило, вы будете профилировать оптимизированный код, потому что это код, который используется в производственных системах.
Что касается трассировки стека, то причины, по которым некоторые фреймы стека могут отсутствовать, обычно из-за встраивания метода, важной оптимизации, выполняемойJIT-компилятор.Поэтому, если A вызывает B, что, в свою очередь, вызывает C, и если JIT-компилятор вставил B в A, то стек вызовов покажет вам, что A вызвал C, и для B не будет фрейма, даже если он есть в исходном коде.Также некоторые кадры стека могут отсутствовать, потому что у профилировщика не было достаточной информации об отладке, поэтому он не мог полностью пройти по стеку.Точно так же номера строк исходного кода могут не совпадать, потому что JIT-компилятор может переставлять код или удалять некоторые фрагменты кода, что затрудняет точное сопоставление между собственным кодом и исходным кодом.Так что в итоге вы увидите приблизительное отображение.