Windbg で sosex を使ってマネージコードのソースレベルでブレークポイント設定
Windbg でマネージコードをデバッグするとき、sosex を使えば、ソースレベルでブレークポイントを設定できる。
- '.load sosex.dll' で sosex をロード。
- '!mbp ソースファイル名 行番号' でブレークポイント設定。
- 'g' で実行開始。
- ブレークポイントにヒットした。
- '.loadby sos.dll clr' で sos をロード (フレームワークが 3.5 までは 'clr' を 'mscorwks' に変更する、参考: Unable to load SOS in WinDbg)
- '!ClrStack' でマネージスタックを表示。
- 指定の位置でブレークしている!
Visual Studio のインクリメンタルサーチ
Visual Studio のインクリメンタルサーチを使えば、1文字打つごとにカーソルが移動し検索できる。
- Ctrl + I でインクリメンタルサーチ開始。マウスカーソルが双眼鏡の形に変わる。
- サーチする文字を入力すると、その文字へカーソルが移動する。下の例では 'c' を入力。
- 次の文字を入力すると、さらにカーソルが移動する。例では 'a' を入力し 'ca' へ移動。
- サーチ中に Ctrl + I を入力すると、次のサーチ文字列へカーソルが移動する。例では次の 'ca' へ移動。
- ESC を押すと、インクリメンタルサーチ終了。
Native Exe ファイルの実行開始アドレス
Dumpbin コマンドで exe ファイルのヘッダ情報を表示すると、その中に開始アドレスが含まれている。
ためしに windbg で、開始アドレスから逆アセンブルしてみる。
64 ビットのアドレスは ***長い***。
Visual Studio の F8 で次の項目に移動できる。
- Error List
- Find Results
- Find Symbol Results で、
F8 を押すと、
- これらのウインドウの選択項目が次へ移動し、
- コードエディタでは対応する行にカーソルが移動
します。とっても便利!
DataGridView のあるセルの境界線スタイルを変更する
DataGridView のあるセルの境界線スタイルを変更するには、
- CellPainting イベント で、
- 変更したいセルの AdvancedBorderStyle を設定する。
次のプログラムは、セル (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; } } } }
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); } } } }
表示はこんなふうになる。