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

質問
すべての返信
-
-
佐祐理さんの書き込みにあるリンク先にも書かれていますが、
[アドレス レベルのデバッグを有効にする]と同じ設定場所に
ツール→オプション→デバッグ→全般→['マイ コードのみ' 設定を有効にする]
がありますが、ONにはできないというのは、これでは望んだ効果を発揮しないということでしょうか?
ところで、C#ってそんなに逆アセンブルでるかな? -
何ヶ月もでないこともありますが、出だすとよく出ます。
その出たときの呼び出し履歴に、自分の書いたコードがあるのでしょうか?
呼び出し履歴に自分の書いたコードがある状態であれば、その位置で止まったと表示されるのが期待結果かと思いますし、実際、マイコードのみが ON、アンマネージデバッグが OFF であればそのようになると思います。
呼び出し履歴に自分が書いたコード(C#)がないのであれば、別スレッドで起きた問題ですので、今表示されている内容以外に表示するものがないでしょう。その場合、いくら出したくないと思ったところで避けられませんし、そうなる原因を探す方に時間を使った方が建設的です。
C++ で書いた部分で落ちて、ソースコードが表示されないというトラブルであれば、C++ の DLL をデバッグ情報ありでビルドして、pdb と一緒に DLL をコピーしてください。(+デバッグ時にアンマネージデバッグを有効にするか(C# 側の場合)、デバッグの種類を混合やネイティブにする(C++側の場合)か)
そうしないと、C++ のソースの位置を特定できないので、逆アセンブルした結果が表示されるでしょう。 -
基本的なことが理解できていないのかもしれません。
通常のコンソールアプリであれば、Main()メソッドから呼び出しがおおよそ1つに連なっています。処理を抜け出せば呼び出し元に返るだけです。
対してWindows Formアプリケーションはそうではありません。Main()内で行われるApplication.Run()で呼び出し関係は切れています。それ以降は、Windowsからのコールバックで成り立っています。(メッセージループ)
この場合、最終的な呼び出し元は自作アプリケーションを離れてメッセージループやさらにその先のOS部分となってしまいます。ソースコードが表示できなくて当然です。 -
> その出たときの呼び出し履歴に、自分の書いたコードがあるのでしょうか?
今は、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度、このスレッドに出ている設定が正しくできているか見直すことをおすすめします。
-
> その出たときの呼び出し履歴に、自分の書いたコードがあるのでしょうか?
今は、Paintイベントを抜け出す瞬間に起こっていまして、
C#の自分が書いたコードはあります。(C++の自分のDLLのコードはありません。)
呼び出し履歴の黄色い矢印で、user32.dll!75fac4ef() を指しています。通常、発生しないような場所で例外が発生しているので、逆アセンブルが表示されるのは仕方がないことです。
「表示されないように設定を変える(禁止する)」ではなく、「なぜ発生しているのか?発生している原因は何か?自分のコードの何が悪いのか?」という方向性で考えるべきでしょう。
(デバッグ中だけの問題ではなく、他者の環境にリリースした際も発生する「(あなたが作った)アプリケーションの不具合」と認識してください)たいていの場合は、書いているコードの中に何か問題があります。
Paint イベントの直後というとっかかりがあるのであれば、まずは Paint イベントでメモリを壊していないか、お作法に則っていない処理をしていないかを疑うところからでしょうか。
ただ、作っているアプリケーションによっては、Paint イベント以外のところが原因で後で引っかかることもあり得ます。残念ながら、現状の情報から他者が推測、アドバイスするのは困難です。
- 編集済み AzuleanMVP, Moderator 2012年11月27日 13:28
- 回答としてマーク クサキ 2012年11月28日 5:35
- 回答としてマークされていない クサキ 2012年11月28日 5:57