0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

S02 C#/.NET 現場トラブルシュート早見表:まず疑う順番(止血/応急処置)

0
Last updated at Posted at 2026-01-18

困ったら戻る1ページ。症状別に、関連リンクを一覧化。
Ctrl+F(ページ内検索)でも探せるようにしている。追加分はこの表へ反映していく。

  • 下の表は、いまの状況に近い行から関連リンクへつながる
  • 表の左端に 「Ctrl+F用キーワード」 を置いてあり、ページ内検索でも行を見つけられる(例:固まる SaveChanges 文字化け 使用中
  • すぐ止めたい・まず落ち着かせたいときは 「15分でやること(順番)」 が使える
  • 相談・問い合わせ・引き継ぎでは 「状況メモ(5つ)」 をそのまま貼れる

症状から引く(逆引き)

Ctrl+F用キーワード いまの状況 まず読む(1本) 次に読む(必要なら最大2本)
固まる 応答なし フリーズ UIが固まる/応答なし E04 UIフリーズの正体:メッセージループ/Invoke/async G11 Application.Runとメッセージループ
R06 非同期の掟:await帰還/デッドロック
.Result .Wait デッドロック .Result/.Wait を触ったら固まった E03 WinFormsが固まる:.Result/.Wait/Invokeの切り分け G13 UIスレッドと非同期:帰還先/よくあるパターン
R06 非同期の掟:await帰還/デッドロック
返ってこない 待ち タイムアウト 返ってこない/待ちが終わらない R10 タイムアウトとキャンセル:無限待ちを切る E07 Webhookが飛ばない:タイムアウト/リトライ
R05 ログ設計:調査できる形を残す
例外 ログ catch 例外が見えない/ログが薄い R04 例外設計:catch握り潰し禁止とthrow; R05 ログ設計:再現不能を減らす三点セット
突然終了 UnhandledException AppDomain 例外ログなしで突然終了する E06 例外ログが残らず突然終了:P/Invoke/WndProc/Handle寿命 G12 WndProc入門:WM_*と既定処理
NuGet 参照 依存 NuGetや参照が壊れた E02 NuGet競合:参照崩壊の止血と恒久対策 K27 参照地獄の終わらせ方:向き/境界/配布単位
R01 コーディング規約:命名・例外・ログ・依存
Null NRE null許容 Nullで落ちる/条件が安定しない R09 NullReferenceExceptionを止める:null許容参照/Guard R01 コーディング規約:例外/ログ/依存の考え方
R04 例外設計:throw;でスタックを残す
使用中 Dispose using 画像/ファイルが消せない/掴まれたまま R11 「別のプロセスが使用中です」を解消:IDisposable/using R07 WinForms寿命管理:Dispose/終了経路
G10 Formライフサイクル:Closing/Disposeの役割
SaveChanges 反映 DbContext SaveChangesしても反映されない E08 SaveChangesしても反映されない:反映件数で切る(EF Core Web) E09 SaveChangesしても更新されない:追跡で切る(EF Core クライアント)
時刻 タイムゾーン DateTime 時間がズレる/タイムゾーンが揺れる G22 時間とタイムゾーンがズレる混入点:UTC/オフセット
Contains 比較 大文字小文字 文字列が一致しない/Containsが怪しい R03 文字列比較:StringComparison K33 文字列操作 早見表:Contains/Replace/Split/Regex
IME 確定 KeyPress IMEが壊れる/確定が飛ぶ E05 WinFormsでIMEが壊れる:確定が飛ぶ/文字が消える G14 入力位置(キャレット矩形)とTSF/IMM32
常駐 終了経路 Application.Exit 常駐アプリが終わらない/戻れない G19 トレイ常駐の作法:隠す/戻す/終える R07 WinForms寿命管理:Dispose/終了経路
G10 Formライフサイクル:Closing/Dispose
WinForms ライフサイクル イベント WinFormsの挙動がよく分からない G10 Formライフサイクル:ctor/Load/Shown/Closing/Dispose G12 WndProc入門:WM_*と既定処理
G16 入力を奪わない通知UI:Zオーダー/TopMost
LINQ 遅い 遅延実行 LINQの動きが追えない/遅い気がする K35 LINQサンプル集:出力つき K36 LINQが遅くなる書き方5選:ToList/OrderBy/Contains
文字化け Encoding UTF-8 文字化けする/文字コードが怪しい G21 UTF-8/Shift_JIS/BOMを疑う順番
HotKey 解除 イベント ホットキーが競合する/解除漏れが疑わしい G17 Win32ホットキー:競合/解除漏れ/GetLastWin32Error
Controller 太い 分離 設計の分け方が曖昧/Controllerが太る G25 役割の分け方:MVC/MVP/MVVM G26 超かんたんMVC:Fat Controller対策

15分でやること(順番)

最初の15分は 影響を止める → 証拠を残す → 条件を同じにする の順。
順番を入れ替えると、比較が崩れて戻りが増える。

貼る用(テキスト)

[15分]
1) 影響を止める:直近の差分を狭める/対象を絞る/再試行で悪化しない状態を作る
2) 証拠を残す:例外・入力条件・所要時間を残す/1操作を追える印を付ける(操作IDなど)
3) 条件を同じにする:端末差・設定差・バージョン差を疑う/再現条件をメモし、検証のたびに同じ条件で試す
  1. 影響を止める
    直近の差分を狭める。対象を絞る。再試行で悪化しない状態を先に作る。

  2. 証拠を残す
    例外・入力条件・所要時間を残す。1操作を追える印も付ける(操作IDなど)。

  3. 条件を同じにする
    端末差/設定差/バージョン差を一度疑う。再現する条件をメモに残し、検証のたびに同じ条件で試す。


代表ケース(短い例)

ケース1:catchで握り潰している

スタックが消えると、調査が止まる。

避けたい例

try
{
    DoWork();
}
catch (Exception)
{
    // 何も残らない
}

こう書く

try
{
    DoWork();
}
catch (Exception ex)
{
    LogError(ex);
    throw; // スタック保持
}

関連:

ケース2:UIスレッドで待っている

Result/Wait はUIを止めやすい。

避けたい例

var result = GetAsync().Result;

こう書く

var result = await GetAsync();

関連:

ケース3:タイムアウトが無い

上限が無い待ちは、調査も終わらない。

using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
var body = await client.GetStringAsync(url, cts.Token);

関連:


チェックリスト(レビューで見るところ)

表の内容を短く貼れる形にしておく。

貼る用(テキスト)

[レビュー観点]
- 例外:catchで握り潰さない/throw;でスタックを残す
- ログ:入力条件・所要時間・操作IDが残る
- 待ち:タイムアウトがある/キャンセルが通る/無限待ちにならない
- null:外から入った値を受けた直後でGuardする
- UI/非同期:UIスレッドでResult/Waitしない/async voidの扱いが決まっている
- 寿命管理:Disposeと解除がどこで走るか説明できる
- Win32/WndProc:既定処理を抜かない/重い処理を入れない
- 依存:参照の向きと配布単位が説明できる
観点 確認ポイント(会話で言える形) 関連
例外 catchで握り潰していない / throw; でスタックを残す R04 例外設計:catch握り潰し禁止とthrow;
ログ 1操作を追える印がある(操作IDなど) / 入力条件と所要時間が残る R05 ログ設計:再現不能を減らす三点セット
待ち タイムアウトがある / キャンセルが通る / 無限待ちにならない R10 タイムアウトとキャンセル:無限待ちを切る
null 外から入った値を受けた直後でGuardする R09 NullReferenceExceptionを止める:null許容参照/Guard
UI/非同期 UIスレッドで Result/Wait を使わない / async void の扱いが決まっている R06 非同期の掟:await帰還/デッドロック
寿命管理 Disposeと解除がどこで走るか説明できる R07 WinForms寿命管理:Dispose/終了経路
R11 「別のプロセスが使用中です」を解消:IDisposable/using
Win32/WndProc 既定処理を抜かない / 重い処理を入れない G12 WndProc入門:WM_*と既定処理
依存 参照の向きと配布単位が説明できる E02 NuGet競合:参照崩壊の止血と恒久対策
K27 参照地獄の終わらせ方:向き/境界/配布単位

状況メモ(5つ)

調査が長引くと、何が分かっていて何が未確認かがズレやすい。
最初に5つだけ残すと、相談・問い合わせ・引き継ぎが速い。

貼る用(テキスト)

[状況メモ]
1) 症状:何が起きているか(固まる/落ちる/反映されない…)
2) 発火点:どの操作・どの画面・どの入力で起きるか
3) 証拠:例外/ログ/所要時間/操作IDの有無
4) 条件:端末・設定・バージョン・タイムゾーンなど
5) 直近差分:直近の変更(コード/配布/設定)

関連リンク

このページは症状別リンク集。全体一覧と最新版リンクはS00に集約。

推奨タグ: C# .NET WinForms トラブルシューティング 設計

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?