gdbプロンプト「you can't do that without a process to debug」解決方法


最近IDEを作成しており、miインタフェースで呼び出されたgdbをベースにデバッグしています.
できるだけ広いgdbバージョンをサポートするため、gdb/miインタフェースは偶発的に更新され、最も手間のかかる処理方法は間違いなく古いバージョンを呼び出すことであり、新しいバージョンはdeprecatedであるがサポートされているインタフェースである.
事はここにある.
このIDEにはメモリを表示する機能が追加され、gdb/miには2つのインタフェースがあります.
      -data-read-memory [ -o byte-offset ]
        address word-format word-size
        nr-rows nr-cols [ aschar ]
および
      -data-read-memory-bytes [ -o byte-offset ]
        address count
の第1のインタフェースは、出力コンテンツのフォーマットを自分で処理する必要がなく、初期アドレスが読み取り可能であることが欠点であるより多くの機能を提供する.このインタフェースはdeprecatedとしてマークされています
.
公式ドキュメントの例は次のとおりです.
     4-data-read-memory bytes+16 x 1 8 4 x
     4^done,addr="0x000013a0",nr-bytes="32",total-bytes="32",
     next-row="0x000013c0",prev-row="0x0000139c",
     next-page="0x000013c0",prev-page="0x00001380",memory=[
     {addr="0x000013a0",data=["0x10","0x11","0x12","0x13"],ascii="xxxx"},
     {addr="0x000013a4",data=["0x14","0x15","0x16","0x17"],ascii="xxxx"},
     {addr="0x000013a8",data=["0x18","0x19","0x1a","0x1b"],ascii="xxxx"},
     {addr="0x000013ac",data=["0x1c","0x1d","0x1e","0x1f"],ascii="xxxx"},
     {addr="0x000013b0",data=["0x20","0x21","0x22","0x23"],ascii=" !\"#"},
     {addr="0x000013b4",data=["0x24","0x25","0x26","0x27"],ascii="$%&'"},
     {addr="0x000013b8",data=["0x28","0x29","0x2a","0x2b"],ascii="()*+"},
     {addr="0x000013bc",data=["0x2c","0x2d","0x2e","0x2f"],ascii=",-./"}]
     (gdb)
はIDEで表示する方法とほぼ一致しています.
第2のインタフェースは非常に簡単であり、初期アドレスまたは終了アドレスのみで読み取りが可能な要求範囲内から読み出しが必要なデータを抽出して返すことができるという利点がある.
公式文書の例:
     -data-read-memory-bytes &a 10
     ^done,memory=[{begin="0xbffff154",offset="0x00000000",
                   end="0xbffff15e",
                   contents="01000000020000000300"}]
     (gdb)
は間違いなく最初の方法でやったほうが簡単ですが、私の頭には弦が欠けていて、deprecatedを見て最初のインタフェースを捨てて、先輩にプレゼンテーションするとき、先輩が使っていたgdb 6.8は、いつもこのコマンドがないことを提示して、やっと問題を発見しました.
仕方なく改めた.
心の中では前の仕事を注釈したくないので、gdbバージョンを判断して、別々に処理したいと思っています.
これは、2番目のインタフェースがどの版に現れたのかを調べる必要があります.公式文書には明記されていないが、公式サイトのnewsにもこのような小さなことは言及されていないし、NEWSのファイルを一面一面調べたくないので、二分法で一つ一つダウンロードしてみよう.このインタフェースは7.3で初めて現れるはずです.
コードを変更し、各gdbバージョンでテストしましたが、次のようになりました.
自分のコードが間違っていると思っていたのに、直したばかりのコードがなぜこのような問題になったのか、どう考えても思い出せない.
プロンプトを見ると、targetプロセスが起動していないはずです.デバッグ版では、このようなデバッグ情報も出力されます.
dll呼び出しに問題があったのかもしれないと思います.しかしtargetコードはこれ以上簡単ではありません.呼び出されたdllはnot foundできないはずです.直接ターゲットディレクトリの下に行って、ダブルクリックしてtargetを実行して、ヒント
これでやっと分かるのですが、元々は新しい(具体的には詳しくは調べていません)MinGWのg++コンパイル後のファイルはいくつかのライブラリに依存する必要があります.これらのライブラリは古いMinGWにはなく、古いバージョンのgdbもデバッグできません.旧バージョンMinGWに移行してから、もう一度コンパイルして実行するだけで、「you can't do that without a process to debug」を避けることができます.