Windbg で sosex を使ってマネージコードのソースレベルでブレークポイント設定

Windbg でマネージコードをデバッグするとき、sosex を使えば、ソースレベルでブレークポイントを設定できる。

  1. '.load sosex.dll' で sosex をロード。
  2. '!mbp ソースファイル名 行番号' でブレークポイント設定。
  3. 'g' で実行開始。
  4. ブレークポイントにヒットした。
  5. '.loadby sos.dll clr' で sos をロード (フレームワークが 3.5 までは 'clr' を 'mscorwks' に変更する、参考: Unable to load SOS in WinDbg)
  6. '!ClrStack' でマネージスタックを表示。
  7. 指定の位置でブレークしている!

f:id:tt195361:20150528102143p:plain

Visual Studio のインクリメンタルサーチ

Visual Studioインクリメンタルサーチを使えば、1文字打つごとにカーソルが移動し検索できる。

  1. Ctrl + I でインクリメンタルサーチ開始。マウスカーソルが双眼鏡の形に変わる。
  2. サーチする文字を入力すると、その文字へカーソルが移動する。下の例では 'c' を入力。
  3. 次の文字を入力すると、さらにカーソルが移動する。例では 'a' を入力し 'ca' へ移動。
  4. サーチ中に Ctrl + I を入力すると、次のサーチ文字列へカーソルが移動する。例では次の 'ca' へ移動。
  5. ESC を押すと、インクリメンタルサーチ終了。

f:id:tt195361:20150528082220p:plain

Native Exe ファイルの実行開始アドレス

Dumpbin コマンドで exe ファイルのヘッダ情報を表示すると、その中に開始アドレスが含まれている。

f:id:tt195361:20150527174112p:plain

ためしに windbg で、開始アドレスから逆アセンブルしてみる。

f:id:tt195361:20150527174301p:plain

64 ビットのアドレスは ***長い***。

Visual Studio の F8 で次の項目に移動できる。

Visual Studio

  • Error List
  • Find Results
  • Find Symbol Results で、

F8 を押すと、

  • これらのウインドウの選択項目が次へ移動し、
  • コードエディタでは対応する行にカーソルが移動

します。とっても便利!

f:id:tt195361:20150525143621p:plain

DataGridView のあるセルの境界線スタイルを変更する

DataGridView のあるセルの境界線スタイルを変更するには、

次のプログラムは、セル (1, 1) の境界線を DataGridViewAdvancedCellBorderStyle.InsetDouble に設定する。e.AdvancedBorderStyle で、Top と Left は設定した内容が表示されたが、Bottom と Right は表示されなかった。そのため、下のセルと次のセルの Top と Left を設定した。

using System;
using System.Windows.Forms;

namespace DataGridViewCellBoundary3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.Columns.Add("Column 1", "Column 1");
            dataGridView1.Columns.Add("Column 2", "Column 2");
            dataGridView1.Columns.Add("Column 3", "Column 3");

            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
        }

        private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if (e.ColumnIndex == 1 && e.RowIndex == 1)
            {
                e.AdvancedBorderStyle.Top = DataGridViewAdvancedCellBorderStyle.InsetDouble;
                e.AdvancedBorderStyle.Left = DataGridViewAdvancedCellBorderStyle.InsetDouble;
            }
            if (e.ColumnIndex == 2 && e.RowIndex == 1)
            {
                e.AdvancedBorderStyle.Left = DataGridViewAdvancedCellBorderStyle.InsetDouble;
            }
            if (e.ColumnIndex == 1 && e.RowIndex == 2)
            {
                e.AdvancedBorderStyle.Top = DataGridViewAdvancedCellBorderStyle.InsetDouble;
            }
        }
    }
}

f:id:tt195361:20150522164727p:plain

参考: How to Merge DataGridView Cell in Winforms

UserControl のキャプション用ラベル

UserControl のキャプションとして使うラベル。

  • 親コントロール内にフォーカスがあるかないかで、背景色を変える。
  • 背景色は、グラデーションで表示する。
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace HeaderedContent
{
    internal class CaptionLabel : Label
    {
        private const LinearGradientMode GradientMode = LinearGradientMode.Horizontal;

        private Color StartColor
        {
            get
            {
                if (Parent.ContainsFocus)
                {
                    return SystemColors.GradientActiveCaption;
                }
                else
                {
                    return SystemColors.GradientInactiveCaption;
                }
            }
        }

        private Color EndColor
        {
            get
            {
                if (Parent.ContainsFocus)
                {
                    return SystemColors.ActiveCaption;
                }
                else
                {
                    return SystemColors.InactiveCaption;
                }
            }
        }

        protected override void OnPaintBackground(PaintEventArgs pevent)
        {
            Graphics g = pevent.Graphics;
            Rectangle rect = new Rectangle(0, 0, Width, Height);

            using (var brush = new LinearGradientBrush(rect, StartColor, EndColor, GradientMode))
            {
                g.FillRectangle(brush, rect);
            }
        }
    }
}

表示はこんなふうになる。

f:id:tt195361:20150520133552p:plain

参考: Simple Label Gradient