2

gdb のブレークポイントの後に呼び出される一連のコマンドを定義しようとしています。

    break some_function
    commands
       up
       next
       printf "some_string"
       continue
    end

この場合 (たとえば) some_function で中断し、スタック フレームに移動して、次のコマンドを介してこの関数のすぐ後ろにジャンプし、「some_string」(または関数によって変更された変数) を出力し、あとは続けるだけです。しかし、gdb は次のコマンドの後に停止し、ユーザーが何かを入力するのを待って、次のコマンドを無視するため、うまくいきません。

編集:わかりました、上記の例は私の説明に正しく適合しませんでした. 私が本当に望んでいたのは(コメント者のニコライに感謝します。以下を参照してください)、次のようなものでした:

    break some_function
    commands
       finish
       printf "some_string"
       continue
    end

これは「some_function」で中断し、その関数を実行し、「some_function」の実行直後に文字列「some_string」を返して出力します。次のコマンドで以前に発生した問題は、finish コマンドで発生します。このコマンドの後に実行が停止し、gdb は次の printf ステートメントと continue ステートメントを無視して、ユーザーの入力を待ちます。申し訳ありませんが、この質問は少し混乱しました。私自身は満足していませんが、もう一度投稿することはより良い解決策ではありません (コメントが失われ、クロス投稿になるため)。

4

2 に答える 2

2

わかりました、私は自分で答えを見つけたと思います.gdbは、内部的にフィニッシュと次のコマンドにブレークポイントを設定しているようです. ただし、このブレークポイントでのブレークを克服するために、フックを定義できます。私が考える最良の方法は、副作用を避けるために独自のバージョンの仕上げ (または次のコマンド) を生成することです。

    define myfinish
      finish
    end

    define hook-myfinish
      printf "some_string"
      continue
    end

    break some_function
    commands
      myfinish
    end

silent中断コマンド セクションの先頭に次のステートメントを使用して、中断時に追加の出力を抑制することをお勧めします。

    break some_function
    commands
      silent
      myfinish
    end
于 2013-01-10T16:47:39.123 に答える
1

単にsome_function+0x4オフセットまたは同様のオフセットでブレークしないのはなぜですか?正しいオフセットを知るには、[次へ]を1回クリックし、オフセットを書き留めます...

break some_function+0x4
commands
   up
   printf "some_string"
   continue
end
于 2013-01-10T15:43:51.203 に答える