Я отлаживаю некоторый код JIT. Я присоединяю gdb
к запущенному процессу. Я ищу способы установить точку останова (или любой другой способ), который сделает gdb
break/pause на каждом call instruction
определенной функции. Я знаю имя функции.Есть ли способ установить точку останова для остановки программы при вызове инструкции к определенной функции?
Примечание: я могу установить точку разрыва на принятой ветке для call instruction
, то есть gdb перерывы в функции, но я хочу, чтобы отладчик должен был сломаться, прежде чем принимать эту ветвь i.e на call instruction
.
Возможно ли это?
Благодаря
Это очень трудно граничить с невозможным. Существует много способов вызова функции, и они не всегда могут использовать инструкцию 'call', в частности, если ваша функция находилась в положении хвоста. Если используется указатель на ваш JIT-код, он может быть вызван из любого места. И просто перечисление местоположения инструкций 'call' невозможно - они, возможно, еще не были JITed! Я хотел бы отметить, что, просто взглянув на адрес возврата, нажатый на стек, «вызывать», вы можете найти своего звонящего (при условии, что оптимизация хвостового вызова не возникла). –
@IwillnotexistIdonotexist: Почему бы не сделать это ответом? – alk
типичным методом является установка разрыва в начале функции (с использованием «имени функции br»), а затем, когда код разбивается, используйте обратную трассировку (bt), чтобы отобразить, где/что называется этой функцией. Следует отметить, что не будет много полезной информации, если только 1) не будет доступен исходный код, 2) код с компилированным (для gcc) с -g или -gdb, также лучше не использовать какую-либо оптимизацию, поэтому номера кода и строк в источнике будет модельный ряд – user3629249