2014-12-25 1 views
1

Я отлаживаю некоторый код JIT. Я присоединяю gdb к запущенному процессу. Я ищу способы установить точку останова (или любой другой способ), который сделает gdb break/pause на каждом call instruction определенной функции. Я знаю имя функции.Есть ли способ установить точку останова для остановки программы при вызове инструкции к определенной функции?

Примечание: я могу установить точку разрыва на принятой ветке для call instruction, то есть gdb перерывы в функции, но я хочу, чтобы отладчик должен был сломаться, прежде чем принимать эту ветвь i.e на call instruction.

Возможно ли это?

Благодаря

+4

Это очень трудно граничить с невозможным. Существует много способов вызова функции, и они не всегда могут использовать инструкцию 'call', в частности, если ваша функция находилась в положении хвоста. Если используется указатель на ваш JIT-код, он может быть вызван из любого места. И просто перечисление местоположения инструкций 'call' невозможно - они, возможно, еще не были JITed! Я хотел бы отметить, что, просто взглянув на адрес возврата, нажатый на стек, «вызывать», вы можете найти своего звонящего (при условии, что оптимизация хвостового вызова не возникла). –

+0

@IwillnotexistIdonotexist: Почему бы не сделать это ответом? – alk

+0

типичным методом является установка разрыва в начале функции (с использованием «имени функции br»), а затем, когда код разбивается, используйте обратную трассировку (bt), чтобы отобразить, где/что называется этой функцией. Следует отметить, что не будет много полезной информации, если только 1) не будет доступен исходный код, 2) код с компилированным (для gcc) с -g или -gdb, также лучше не использовать какую-либо оптимизацию, поэтому номера кода и строк в источнике будет модельный ряд – user3629249

ответ

3

Я хочу, что отладчик должен сломать, прежде чем принимать эту ветвь

Но почему? Остановка до принятия ветки (в отличие от остановки сразу после) дает вам абсолютно никакой дополнительной информации.

Как верно указано Iwillnotexist Idonotexist, существует множество способов ВЫЗВАТЬ данную функцию, например.

CALL 0x8(%rax) 
CALL %rbx 
CALL *0x12345678 

Кроме того, в JITted коды, такие инструкции вызова могут получить сгенерированные и отбрасываются при очень высокой скорости, так что даже если вы могли бы волшебным образом найти их все, вы все равно должны обновить список точек останова, чтобы установить когда ваш JIT чувствует себя так.

+0

Спасибо за ответ. Можете ли вы также посмотреть на связанный с этим вопрос, который я задал в другой должности, и дать вам свои материалы. Еще раз спасибо. https://stackoverflow.com/questions/27656270/how-do-you-go-about-knowing-what-is-happening-in-a-jited-code – abhi

Смежные вопросы