none
デバック中に逆アセンブルのソースコードが出てくるのを禁止できませんか?

    質問

  • VS2008です。
    デバックしていると、時々、逆アセンブルのソースコード内のトレースになります。
    見ても分からないですし、なかなかその中から抜け出せなかったり、抜け出しても、
    自分のソースのトレースしたいところを過ぎてしまいます。
    逆アセンブルのソースコード内に入ることを禁止できませんか?

    2012年11月21日 7:46

すべての返信

  • 逆アセンブルのソースコードは出てこなくなりましたが、
    ”現在の場所のソースコードを表示できません”となり、なかなか先へ進めなくなったりします。

    2012年11月21日 9:39
  • それがクサキさんの臨んだことだから当然の結果です。

    ソースコードが見つからないからこそ逆アセンブルを表示する以外にする手がないのです。そこで質問されたように逆アセンブルを表示しなければ、何も表示できなくなるだけです。

    本来望むべきは、ソースコードが表示されるようにすることでは? でも質問文はそのようにはなっていませんでした。

    2012年11月21日 12:57
  • 書き方が悪かったのでしょうか。
    やりたいことは、自分のコードだけをトレースしたいということです。
    何かのコードに入って行き、なかなか抜け出せないということを避けたいということです。
    2012年11月22日 0:16
  • 望まれていることは「マイコードのみ」を ON かな?(正確な名称ではないですが)

    望んでいるところまでステップアウトする場合は、コールスタック(呼び出し履歴)ウインドウから、戻りたい場所を指定するようにしたほうがいいですよ。アセンブリで表示されているかどうかに関係なく、自分で書いているコードの範囲だって、呼び出しの履歴を戻りたい場所は違うという意味で、です。

    2012年11月22日 0:41
  • クサキさんの望まれていることとはちょっと違うかもしれませんが。。。
    ご自身のコード内をトレースしている最中に、アセンブリ コードが表示されてしまったのであれば、そのタイミングで [Shift + F11] を複数回押下することで、ご自身のコード内に戻ってこれるかも。
    2012年11月22日 2:16
  • 「マイコードのみ」を ON にしたいということです。コールスタック(呼び出し履歴)ウインドウの使い方良く分かりませんでした。

    [Shift + F11] を複数回押下することで、戻る時もあれば、なかなか戻れないこともあります。
    そういう分けの分からないことが解消できないかとの質問です。

    どうも「マイコードのみ」を ONにはできないようですね?


    2012年11月22日 9:42
  • 佐祐理さんの書き込みにあるリンク先にも書かれていますが、
    [アドレス レベルのデバッグを有効にする]と同じ設定場所に
    ツール→オプション→デバッグ→全般→['マイ コードのみ' 設定を有効にする]
    がありますが、ONにはできないというのは、これでは望んだ効果を発揮しないということでしょうか?

    ところで、C#ってそんなに逆アセンブルでるかな?

    2012年11月22日 13:08
  • ところで、C#ってそんなに逆アセンブルでるかな?

    ほかの質問から察するに、DllImportでネイティブDLLを呼び出しているので、.pdbも見つからず逆アセンブルに入っている可能性も。

    でも質問場所にC#フォラームを選択してますし、質問文でC++は一切触れられていないので、ひとまず無関係ですね。

    2012年11月23日 1:20
  • ツール→オプション→デバッグ→全般→['マイ コードのみ' 設定を有効にする]
    はONになっていました。

    C++のDLLを利用していますが、C#の問題だと思い、ここに投稿しています。

    > ところで、C#ってそんなに逆アセンブルでるかな?
    何ヶ月もでないこともありますが、出だすとよく出ます。
    プログラムの種類によるということですか?
    今回は、グラフィックを書いています。Paintイベントとか、Activateイベントなどに入っています。

    2012年11月26日 5:32
  • 何ヶ月もでないこともありますが、出だすとよく出ます。

    その出たときの呼び出し履歴に、自分の書いたコードがあるのでしょうか?

    呼び出し履歴に自分の書いたコードがある状態であれば、その位置で止まったと表示されるのが期待結果かと思いますし、実際、マイコードのみが ON、アンマネージデバッグが OFF であればそのようになると思います。

    呼び出し履歴に自分が書いたコード(C#)がないのであれば、別スレッドで起きた問題ですので、今表示されている内容以外に表示するものがないでしょう。その場合、いくら出したくないと思ったところで避けられませんし、そうなる原因を探す方に時間を使った方が建設的です。

    C++ で書いた部分で落ちて、ソースコードが表示されないというトラブルであれば、C++ の DLL をデバッグ情報ありでビルドして、pdb と一緒に DLL をコピーしてください。(+デバッグ時にアンマネージデバッグを有効にするか(C# 側の場合)、デバッグの種類を混合やネイティブにする(C++側の場合)か)
    そうしないと、C++ のソースの位置を特定できないので、逆アセンブルした結果が表示されるでしょう。

    2012年11月26日 14:11
    モデレータ
  • > その出たときの呼び出し履歴に、自分の書いたコードがあるのでしょうか?

    今は、Paintイベントを抜け出す瞬間に起こっていまして、
    C#の自分が書いたコードはあります。(C++の自分のDLLのコードはありません。)
    呼び出し履歴の黄色い矢印で、user32.dll!75fac4ef() を指しています。

    2012年11月27日 4:37
  • 基本的なことが理解できていないのかもしれません。

    通常のコンソールアプリであれば、Main()メソッドから呼び出しがおおよそ1つに連なっています。処理を抜け出せば呼び出し元に返るだけです。

    対してWindows Formアプリケーションはそうではありません。Main()内で行われるApplication.Run()で呼び出し関係は切れています。それ以降は、Windowsからのコールバックで成り立っています。(メッセージループ)
    この場合、最終的な呼び出し元は自作アプリケーションを離れてメッセージループやさらにその先のOS部分となってしまいます。ソースコードが表示できなくて当然です。

    2012年11月27日 6:35
  • > その出たときの呼び出し履歴に、自分の書いたコードがあるのでしょうか?

    今は、Paintイベントを抜け出す瞬間に起こっていまして、
    C#の自分が書いたコードはあります。(C++の自分のDLLのコードはありません。)

    一般的な構造だと、Paint イベントから抜けた先は .NET Framework の WinForms の内部コードと、Windows API の内部コードになります。(スタック的には Main や ShowDialog の呼び出し元といったものが表示されるので、呼び出し履歴は関係ないですね) マイコードのみでデバッグしている場合、ステップアウトすることで次のマイコードまでブレークが遅延します。

    たとえば、次のようなコードでブレークすると、

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private bool breaking = false;
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                if (breaking)
                {
                    Debugger.Break();
                    breaking = false;
                }
            }
            private void button1_Click(object sender, EventArgs e)
            {
                using (var dlg = new Form1())
                {
                    dlg.breaking = true;
                    dlg.ShowDialog(this);
                    MessageBox.Show("!");
                }
            }
        }

    呼び出し履歴には

    Paint
    [外部コード]
    button1_Click
    [外部コード]
    Main

    と表示されますが、この状態からステップアウトするとアセンブリが表示されることなく、制御がフォームに戻ります。そのままフォームを閉じると、最初のマイコードである MessageBox の手前できちんとブレークします。このように動かないならば、デバッグオプションの設定がおかしいのでしょう。もう1度、このスレッドに出ている設定が正しくできているか見直すことをおすすめします。

    2012年11月27日 6:40
  • > その出たときの呼び出し履歴に、自分の書いたコードがあるのでしょうか?

    今は、Paintイベントを抜け出す瞬間に起こっていまして、
    C#の自分が書いたコードはあります。(C++の自分のDLLのコードはありません。)
    呼び出し履歴の黄色い矢印で、user32.dll!75fac4ef() を指しています。

    通常、発生しないような場所で例外が発生しているので、逆アセンブルが表示されるのは仕方がないことです。
    「表示されないように設定を変える(禁止する)」ではなく、「なぜ発生しているのか?発生している原因は何か?自分のコードの何が悪いのか?」という方向性で考えるべきでしょう。
    (デバッグ中だけの問題ではなく、他者の環境にリリースした際も発生する「(あなたが作った)アプリケーションの不具合」と認識してください)

    たいていの場合は、書いているコードの中に何か問題があります。
    Paint イベントの直後というとっかかりがあるのであれば、まずは Paint イベントでメモリを壊していないか、お作法に則っていない処理をしていないかを疑うところからでしょうか。
    ただ、作っているアプリケーションによっては、Paint イベント以外のところが原因で後で引っかかることもあり得ます。

    残念ながら、現状の情報から他者が推測、アドバイスするのは困難です。

    2012年11月27日 13:28
    モデレータ
  • 一般的には私が期待している動きはするのだと確認しました。
    私の書いているコードに何か悪いところがあるといういうことで、検討していきます。

    2012年11月28日 5:25