web-dev-qa-db-ja.com

なぜリバースデバッグがほとんど使用されないのですか?

gdbは、2009年に 逆デバッグ のサポートを実装しました(gdb 7.0を使用)。 2012年まで聞いたことがありませんでした。今では、特定の種類のデバッグ問題に非常に役立ちます。私はそれを前に聞いたことを望みました。

私が間違っている場合は修正してください。しかし、私の印象では、この技法はまだほとんど使用されておらず、ほとんどの人はそれが存在することを知りません。どうして?

リバースデバッグの使用が一般的なプログラミングコミュニティを知っていますか?

背景情報:

  • Stackoverflow:逆デバッグはどのように機能しますか?
  • gdbは「リバースデバッグ」という用語を使用しますが、他のベンダーは同一または類似の手法に対して他の用語を使用しています。
    • Microsoftはそれを IntelliTrace または「履歴デバッグ」と呼んでいます
    • Javaと呼ばれるリバースデバッガ Omniscient Debugger がありますが、おそらくJava 6では機能しません。
    • 他にもJavaリバースデバッガーがあります
    • OCamlのデバッガー(ocamldebug)はそれを呼び出します time travel
57
Philipp Claßen

1つは、レコーディングをオンにしてデバッグモードで実行すると、通常のデバッグモードに比べてもveryコストがかかることです。また、より多くのメモリを消費します。

行レベルから関数呼び出しレベルに細分度を下げる方が簡単です。たとえば、Eclipseの標準デバッガーでは、「フレームにドロップ」することができます。これは、基本的にすべてのパラメーターをリセットして関数の先頭に戻ることです(ヒープで行われた処理は元に戻されず、finallyブロックは実行されないため、真のリバースデバッガではありません。注意してください)。

これは数年前から利用可能であり、ホットコード置換と連携して動作することに注意してください。

27
ratchet freak

すでに述べたように、パフォーマンスは重要です。 gdbのリバーシブルデバッグでは、gzipのようなものを実行すると、ネイティブで実行する場合に比べて50,000倍の速度低下が見られます。ただし、商用の代替手段があります。私はUndo ndo.io を使用しています。UndoDB製品でも同じことができますが、速度は2倍未満です。他にも市販のリバーシブルデバッガーがあります。

11
user1839284

テクノロジの選択と製品の概要については、1年前に執筆した一連のブログ投稿(およびその後のフォローアップ)を参照してください。

あまり使用されていない理由は、特別なハードウェアが必要か、特別なデバッガーが必要か、システムを正しく設定できるかという点です。残念ながら、ほとんどの人は、デバッグツールから最大の価値を引き出すために時間をかけていません。

そして、gdbの「安価なデフォルト」はほとんど使用できないほど遅く、最も一般的なターゲットシステム以外のすべてに対して、かなりの数の安定性の問題があります。

10
jakobengblom2

TotalViewデバッガーのセールスエンジニアとしての私の経験から、それが存在することを人々は知っていますが、(許容できるかどうかにかかわらず)スローダウンに関係なく、それが機能するとは思っていません。

ケンブリッジ大学は最近 "リバースデバッグを採用できないと、グローバルエコノミーに年間41億ドルのコストがかかる" と題する調査を行いました。

そして、GDBに戻ってみると、(多くの)スローダウンにより、「実際の」アプリケーションではまったく使用できなくなると聞きました。

個人的には、「Hello world!」以外のアプリケーションでリバースデバッグを使用している多くの人からのフィードバックをお待ちしています。

4
SebGR

この「逆」または「歴史的」デバッグについて、もう少し詳しく説明することが重要だと思います。複雑なシステムとそれらの振る舞いを理解し、状態を明示する「イベント」を再現することは絶対に重要だと思います。

私が表現したいのは、なぜこのテクニックが今日それほどあまり適用されていないのか、または関連する問題が明確に議論されることはまれであるのか疑問に思っているのはあなただけではないということです。

ここで、2つの非常に重要な概念を強調しましょう。

1.プログラミングシステムを理解するには、状態を明示的にすることが役立ちます

2.プログラミングシステムをさらに理解するには、一連の状態(イベント)を再生することが非常に役立ちます。

問題に取り組むいくつかの情報源と、問題の提案または設計された解決策(複雑なシステムの状態に対処する)を次に示します。

-タールビットの外、紙: http://shaffner.us/cs/papers/tarpit.pdf 主なアイデア:状態を回避、分離、または明示する

-CQRS http://www.cqrs.nu/ これは、コマンドクエリの分離とイベントソーシングという2つの概念の組み合わせです。さまざまな実装が存在します(Java、C#、Scala)。 Tateシーケンスの再生とドメインモデルの進化は、ここで重要な部分です。

あなたが本当にズームアウトして非常に広い画像を見ると、関数型プログラミングの「上昇」で人々はすでに((無)意識的に) )状態を明示的にするため、fpに引き付けられました!しかし、これはポイント1のみを扱い、2番目の問題に対処するには、関数型リアクティブプログラミングとして「大まかに」説明できる別の概念が必要です。

それで、あなたはすべてうまく言ってよいかもしれませんが、実際にCQRSとFRPを使用するのは誰ですか?私は(具体的な数値がないので、IMO)実際には多くの企業が、彼らがしている仕事がこの用語を持っていることを知らないと言っているだけです。たぶんあなたは少しグーグルでCQRSを使用している企業から聞いたことがありますが、すでにいくつかの成功事例があります。私がNetflixに与えることができる例として、FRPもゆっくりと上昇しています: http://techblog.netflix.com/2013/02/rxjava-netflix-api.html これは、RXの実装をリリースしたばかりです実際には.NETベースです(ただし、Javascript実装もあります)。したがって、人々は今日、これらの技術をすでに使用しています。複雑なシステムを理解し、さらに改善するために。そのため、リバースデバッグ手法を使用しています。

2