標準のフックを使用してLuaにブレークポイントを実装するにはどうすればよいですか?

それ

この質問は、p。の演習25.7によって動機付けられています。Luaでのプログラミングの264 (第4版)、より具体的には、ヒントで提案された最適化(以下の引用で強調しました):

演習25.7:ブレークポイント用のライブラリを作成します。少なくとも2つの機能を提供する必要があります

setbreakpoint(function, line) --> returns handle

removebreakpoint(handle)

関数とその関数内の行によってブレークポイントを指定します。プログラムがブレークポイントに到達すると、ライブラリはを呼び出す必要がありますdebug.debug(ヒント:基本的な実装では、ブレークポイントにあるかどうかをチェックするラインフックを使用します。パフォーマンスを向上させるには、呼び出しフックを使用してプログラムの実行をトレースし、プログラムがターゲット関数を実行しているときにのみラインフックをオンにします。)

ヒントで説明されている最適化を実装する方法がわかりません。

次のコードについて考えてみます(もちろん、これはこの質問のためだけに作成された人工的な例です)。

 function tweedledum ()
   while true do
     local ticket = math.random(1000)
     if ticket % 5  == 0 then tweedledee() end
     if ticket % 17 == 0 then break end
   end
 end

 function tweedledee ()
   while true do
     local ticket = math.random(1000)
     if ticket % 5  == 0 then tweedledum() end
     if ticket % 17 == 0 then break end
   end
 end

 function main ()
   tweedledum()
 end

関数mainは、プログラムのエントリポイントを表すことになっています。機能tweedledumtweedledeeは互いにほぼ同一であり、互いに繰り返し呼び出すだけです。

tweedledumの割り当て行にブレークポイントを設定するとします呼び出しフックを実装して、tweedledum呼び出されたかどうかを確認し、目的の行がいつ呼び出された確認する行フックを設定できます1

ほとんどの場合、ループから抜け出す前にtweedledum呼び出しtweedledeeます。これが発生するとします。現在有効になっているラインフックは、それがもう存在しないことを検出しtweedledum、コールフックを再インストールできます。

この時点で、実行は次の2つの方法のいずれかでからtweedledee切り替えることができtweedledumます。

  1. tweedledee呼び出すことができますtweedledum(まだ);
  2. tweedledee呼び出し元に戻ることができますtweedledumこれはたまたまです。

そして、ここに問題があります。コールフックは(1)のイベントを検出できますが、(2)のイベントを検出できません。

確かに、この例は非常に人工的なものですが、問題を説明するために私が思いつくことができる最も簡単な方法です。

私が考えることができる最善のアプローチ(そしてそれは非常に弱いです!)はN、の最初の呼び出しでスタックの深さ追跡し、スタックの深tweedledumさが下に沈んだときにのみラインフックにコールフックを再インストールさせることNです。したがって、ラインフックtweedledeeは、実行されているかどうかに関係なく、スタック内にある限り有効になります。

Luaで利用可能な標準フックのみを使用して、ヒントで説明されている最適化を実装することは可能ですか?2


1私の理解では、ラインフックをインストールすることにより、コールフックは本質的にそれ自体をアンインストールします。AFAICT、コルーチンごとにアクティブにできるフックは1つだけです。私が間違っている場合は私を訂正してください。

2つまり、フックの呼び出し、回線、戻り、およびカウント。

DarkWiiPlayer

そして、ここに問題があります。コールフックは(1)のイベントを検出できますが、(2)のイベントを検出できません。

そして、それはあなたが間違っているところです:3つの可能なフックイベントがあります:lライン、cコール、そしてrリターンのためです。

フック関数内では、returnイベントcallイベントをほぼ同じように扱うことができますがreturnイベントが発生した場合でも、呼び出された関数内にいるため、ターゲット関数はスタックの1つ上の位置にあります。

debug.sethook(function(event, line)
   if event == "call" or event == "return" then
      if debug.getinfo(event=='call' and 2 or 3).func == target then
         debug.sethook(debug.gethook(), 'crl')
      else
         debug.sethook(debug.gethook(), 'cr')
      end
   elseif event == 'line' then
      -- Check if the line is right and possibly call debug.debug() here
   end
end, 'cr')

それはすべてマニュアルにあります;)


フックを設定するときに、現在ターゲット関数内にいるかどうかを確認する必要がある場合があることに注意してくださいそうしないと、ブレークポイントに到達する前に別の関数を呼び出したり、関数から戻ったりしない限り、ブレークポイントをスキップできます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

オプションのフォーマットされたメッセージを使用して、標準に準拠したアサートマクロを実装するにはどうすればよいですか?

分類Dev

毎日のファイルをインポートしてデータブリックスで実行するにはどうすればよいですか?

分類Dev

アトミックポインタを使用してダブルバッファリングを実行するにはどうすればよいですか?

分類Dev

Android Studioでデバッガーを実行してブレークポイントを設定するにはどうすればよいですか?

分類Dev

momemntを使用してタイムゾーンの標準オフセットを取得するにはどうすればよいですか

分類Dev

リフレクションを使用して実行時にメソッドの実装を変更するにはどうすればよいですか?

分類Dev

イテレータ形式を使用してクイックソートを実装するにはどうすればよいですか?

分類Dev

「標準プレフィックス」にパッケージをインストールするにはどうすればよいですか?

分類Dev

マーカー座標を使用してリーフレットポリラインを削除するにはどうすればよいですか?

分類Dev

パブリックプロパティでプライベートセットメソッドを使用して複数のインターフェイスを実装するにはどうすればよいですか?

分類Dev

importlibを使用してその場でソースコードを変更できるインポートフックを実装するにはどうすればよいですか?

分類Dev

セールスフォースの標準オブジェクトをオンラインで表示するにはどうすればよいですか?

分類Dev

SQLObjectを使用して接続ドロップイベントにコールバックを実装するにはどうすればよいですか?

分類Dev

Pythonを使用してランタイムオブジェクト(異なる)実装を実装するにはどうすればよいですか?

分類Dev

composeを使用してインデックスのデフォルトとしてエクスポートするにはどうすればよいですか?

分類Dev

派生クラスが特定のメソッドを実装し、標準のレイアウトを維持するようにするにはどうすればよいですか?

分類Dev

WebStormでブレークポイントを使用してDartBuilderをデバッグするにはどうすればよいですか?

分類Dev

apexChartsでクリックイベントまたはデータポイントの選択を実装するにはどうすればよいですか?

分類Dev

アプリストアへのリダイレクトを使用して、フラッターでディープリンクを実装するにはどうすればよいですか?

分類Dev

特性オブジェクトのチェーンを使用してChainof Responsibilityパターンを実装するにはどうすればよいですか?

分類Dev

ブレークポイントに達したときにvoidメソッドを自動的に実行するにはどうすればよいですか?

分類Dev

Sitecoreファセットにオブジェクトのコレクションを実装するにはどうすればよいですか?

分類Dev

C ++標準ライブラリの実装を見つけるにはどうすればよいですか?

分類Dev

List <インターフェイスを実装するオブジェクト>をメソッドに渡すにはどうすればよいですか?

分類Dev

Tensorflowで事前トレーニングを実装する方法は?チェックポイントファイルから保存された重みを部分的に使用するにはどうすればよいですか?

分類Dev

ブレークポイントが特定の順序でヒットしたかどうかを確認するにはどうすればよいですか?

分類Dev

リフレクトを使用してスライスへのポインターの値を読み取るにはどうすればよいですか?

分類Dev

std :: functionまたはBoostを使用して、C ++でクラスメンバーポインタを実装するにはどうすればよいですか?

分類Dev

ブックマークをエクスポートしてテーブルにインポートするにはどうすればよいですか?

Related 関連記事

  1. 1

    オプションのフォーマットされたメッセージを使用して、標準に準拠したアサートマクロを実装するにはどうすればよいですか?

  2. 2

    毎日のファイルをインポートしてデータブリックスで実行するにはどうすればよいですか?

  3. 3

    アトミックポインタを使用してダブルバッファリングを実行するにはどうすればよいですか?

  4. 4

    Android Studioでデバッガーを実行してブレークポイントを設定するにはどうすればよいですか?

  5. 5

    momemntを使用してタイムゾーンの標準オフセットを取得するにはどうすればよいですか

  6. 6

    リフレクションを使用して実行時にメソッドの実装を変更するにはどうすればよいですか?

  7. 7

    イテレータ形式を使用してクイックソートを実装するにはどうすればよいですか?

  8. 8

    「標準プレフィックス」にパッケージをインストールするにはどうすればよいですか?

  9. 9

    マーカー座標を使用してリーフレットポリラインを削除するにはどうすればよいですか?

  10. 10

    パブリックプロパティでプライベートセットメソッドを使用して複数のインターフェイスを実装するにはどうすればよいですか?

  11. 11

    importlibを使用してその場でソースコードを変更できるインポートフックを実装するにはどうすればよいですか?

  12. 12

    セールスフォースの標準オブジェクトをオンラインで表示するにはどうすればよいですか?

  13. 13

    SQLObjectを使用して接続ドロップイベントにコールバックを実装するにはどうすればよいですか?

  14. 14

    Pythonを使用してランタイムオブジェクト(異なる)実装を実装するにはどうすればよいですか?

  15. 15

    composeを使用してインデックスのデフォルトとしてエクスポートするにはどうすればよいですか?

  16. 16

    派生クラスが特定のメソッドを実装し、標準のレイアウトを維持するようにするにはどうすればよいですか?

  17. 17

    WebStormでブレークポイントを使用してDartBuilderをデバッグするにはどうすればよいですか?

  18. 18

    apexChartsでクリックイベントまたはデータポイントの選択を実装するにはどうすればよいですか?

  19. 19

    アプリストアへのリダイレクトを使用して、フラッターでディープリンクを実装するにはどうすればよいですか?

  20. 20

    特性オブジェクトのチェーンを使用してChainof Responsibilityパターンを実装するにはどうすればよいですか?

  21. 21

    ブレークポイントに達したときにvoidメソッドを自動的に実行するにはどうすればよいですか?

  22. 22

    Sitecoreファセットにオブジェクトのコレクションを実装するにはどうすればよいですか?

  23. 23

    C ++標準ライブラリの実装を見つけるにはどうすればよいですか?

  24. 24

    List <インターフェイスを実装するオブジェクト>をメソッドに渡すにはどうすればよいですか?

  25. 25

    Tensorflowで事前トレーニングを実装する方法は?チェックポイントファイルから保存された重みを部分的に使用するにはどうすればよいですか?

  26. 26

    ブレークポイントが特定の順序でヒットしたかどうかを確認するにはどうすればよいですか?

  27. 27

    リフレクトを使用してスライスへのポインターの値を読み取るにはどうすればよいですか?

  28. 28

    std :: functionまたはBoostを使用して、C ++でクラスメンバーポインタを実装するにはどうすればよいですか?

  29. 29

    ブックマークをエクスポートしてテーブルにインポートするにはどうすればよいですか?

ホットタグ

アーカイブ