menu-debug について
menu-debugは、OpenHarmony ACE EngineのMenuコンポーネントを調査する開発者向けのデバッグスキルです。症状を分類し、コードの位置やログの確認方法、ログパッチの指針を示します。
主な機能
- 01Menuの症状別分類
- 02関連コード位置の特定
- 03既存ログの確認手順
- 04コード分析に基づくログパッチ指針
活用シーン
- 01メニューのサイズやレイアウト不具合の調査
- 02サブウィンドウ再生成やクラッシュの分析
- 03クリック無反応や即時終了の診断
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ openharmonyinsight/ openharmony-skills --skill menu-debugインストール後、Claude Code で/menu-debugを入力して読み込まれたか確認します。
同梱ファイルquick_reference.mdREADME.md
詳細
Menu コンポーネントのデバッグスキル
OpenHarmony ACE Engine における Menu コンポーネントの問題を体系的にデバッグし、原因を診断します。このスキルでは、Menu 関連の問題に対する構造化されたトラブルシューティングの手引きと、ログを自動的に強化するパッチの生成を提供します。
概要
Menu コンポーネントのデバッグでは、複数のレイヤーを分析する必要があります。
- サブウィンドウのライフサイクル - ウィンドウの作成、再作成、破棄
- Menu のレイアウトアルゴリズム - 幅の計算、配置、制約の処理
- Menu パターン - 状態管理、Menu ラッパー、Menu 項目
- パイプラインコンテキスト - ウィンドウ矩形情報、テーマ設定、ディスプレイ構成
- イベント処理 - クリック検出、状態遷移、ジェスチャー処理
重要な要件:
- ⚠️ すべてのログパッチは、実際のコード分析に基づく必要があります - 推測は禁止です
- ⚠️ ログパッチは OpenHarmony のロギング標準(TAG_LOGI/W/E マクロ)に従う必要があります
- ⚠️ 必ずコンテキストを提示してください - ログ文に関連する変数の値を含めます
- ⚠️ 既存のログタグを使用してください - ACE_MENU、ACE_SUB_WINDOW、ACE_OVERLAY
問題の分類
1. Menu の幅に関する問題
症状:
- Menu の幅が 0 と表示される
- Menu が狭すぎる、または広すぎる
- Menu の幅の計算エラー
一般的な原因:
displayWindowRectInfo.Width()が 0 を返す(非同期初期化が完了していない)- PipelineContext の取得元に関する問題(サブウィンドウとメインウィンドウ)
- Menu パラメーターの設定エラー
- テーマ設定の問題
2. サブウィンドウの再作成に関する問題
症状:
- 「recreate subwindow」のログが頻繁に出る
- 素早く開くと Menu が表示されない
- ウィンドウの状態遷移(ATTACHING/DETACHING)
- Menu が空白、または遅れて表示される
一般的な原因:
- Menu を素早く開く(DETACHING 状態との競合)
- ディスプレイ ID の変更
- Menu ラッパーの状態の不一致
3. Menu のレイアウトに関する問題
症状:
- Menu の位置が正しくない
- Menu が対象と重なる
- Menu がクリップされる、または切り詰められる
- Menu が画面の誤った側に表示される
一般的な原因:
- ウィンドウ矩形の計算エラー
- オフセットの計算問題
- デバイスタイプの問題(折りたたみ式スマートフォン)
- セーフエリアが考慮されていない
4. Menu のクラッシュ/不安定性
症状:
- Menu を開くとクラッシュする
- Menu が予期せず消える
- Menu の操作に失敗する
一般的な原因:
- ヌルポインターの参照解除
- Menu パターンのライフサイクルに関する問題
- 状態管理エラー
5. クリック応答に関する問題
症状:
- Menu を起動する箇所をクリックしても反応がない
- クリックしても Menu が開かない
- Menu の操作に対する応答が遅れる
一般的な原因:
- イベントハブが適切に初期化されていない
- ジェスチャーイベントが登録されていない
- Menu の状態によってクリック処理が妨げられている
6. Menu の自動クローズに関する問題
症状:
- 開いた直後に Menu が閉じる
- クリックすると Menu が消える
- ユーザーが操作していないのに Menu が閉じる
一般的な原因:
- Menu ラッパーのステートマシンの問題
- タッチイベント処理の競合
- HideMenu が誤って呼び出されている
7. Menu の配置に関する問題
症状:
- Menu が画面の左上隅に配置される
- Menu が画面上の誤った位置に表示される
- Menu の配置計算エラー
一般的な原因:
- オフセットの計算問題
- アンカーポイントの設定エラー
- MenuWindowRect の計算が正しくない
8. セーフエリア/ナビゲーションバーに関する問題
症状:
- Menu がナビゲーションバーと重なる
- Menu がステータスバーを覆う
- Menu がシステム UI を避けない
一般的な原因:
- セーフエリアのインセットが適用されていない
- ウィンドウ矩形でシステム UI が考慮されていない
- ディスプレイの切り欠き設定が無視されている
9. Menu のサイズに関する問題
症状:
- Menu の幅が 0
- Menu の高さが 0
- Menu のサイズ計算結果が 0
一般的な原因:
- 非同期初期化のタイミング
- PipelineContext の準備が整っていない
- DisplayWindowRectInfo が適切に初期化されていない
デバッグのワークフロー
ステップ 1:問題のカテゴリを特定する
症状に基づいて、問題のカテゴリを特定します。
幅/寸法の問題 → 次を確認します:
Menu width is 0
menuMaxWidth = 0
displayWindowRectInfo.Width() = 0
サブウィンドウの問題 → 次を確認します:
recreate subwindow
DETACHING state
MenuWindowRect
レイアウトの問題 → 次を確認します:
MenuOffset incorrect
position calculation error
menuWindowRect
クラッシュの問題 → 次を確認します:
Segmentation fault
Null pointer
CHECK_NULL_*
クリック/自動クローズの問題 → 次を確認します:
HideMenu called
state transition
gesture event not received
位置の問題 → 次を確認します:
anchorPoint calculation
MenuWindowRect values
offset errors
ステップ 2:主要なコードの場所を特定する
幅/寸法の問題の場合:
menu_layout_algorithm.cpp:941- UpdateChildConstraintByDevicemenu_layout_algorithm.cpp:3618- GetMenuWindowRectInfomenu_layout_algorithm.cpp:931- パイプラインコンテキストのソースmenu_pattern.cpp- メニューラッパーの初期化
サブウィンドウの問題の場合:
subwindow_manager.cpp:1954- GetOrCreateMenuSubWindowsubwindow_manager.cpp:1965- 再作成ログmenu_wrapper_pattern.cpp- メニューラッパーのライフサイクル
レイアウトの問題の場合:
menu_layout_algorithm.cpp:3611-3659- GetMenuWindowRectInfomenu_pattern.cpp- メニューの位置決めmulti_menu_layout_algorithm.cpp- マルチメニューのレイアウト
クリック/自動クローズの問題の場合:
menu_wrapper_pattern.cpp- OnDetach/OnAttachmenu_pattern.cpp- メニューの状態管理menu_view.cpp- イベント処理
位置の問題の場合:
menu_layout_algorithm.cpp- GetMenuWindowRectInfomenu_pattern.cpp- オフセットの計算subwindow_manager.cpp- ウィンドウの矩形計算
ステップ 3:既存のログを収集する
フィルタリングする主要なログタグ:
# Menu-related logs
cat xxx.log | grep "ACE_MENU"
cat xxx.log | grep "ACE_SUB_WINDOW"
cat xxx.log | grep "ACE_OVERLAY"
# Specific issues
cat xxx.log | grep "recreate subwindow"
cat xxx.log | grep "DisplayWindowRectInfo"
cat xxx.log | grep "MenuWindowRect"
cat xxx.log | grep "HideMenu"
cat xxx.log | grep "OnClick"
重要なログパターン:
recreate subwindow→ サブウィンドウが再作成されたDisplayWindowRectInfo width is 0→ 幅の初期化に関する問題DETACHING→ ウィンドウの状態遷移MenuWindowRect→ ウィンドウの矩形計算HideMenu→ メニューを非表示にする操作
新しい問題の分析(v0.2.0)
問題 1:クリックしても反応しない/クリックしてもメニューが表示されない
症状:
- メニューのトリガーをクリックしても反応しない
- クリックしてもメニューが表示されない
- エラーログがまったくない
- クリックイベントが無視されているように見える
考えられる原因:
-
イベントハブが正しく初期化されていない
- GestureEventHub を取得または作成できていない
- Pan イベントがメニューコンポーネントに登録されていない
-
メニューの状態が正しくない
- MenuWrapper が DETACHING 状態になっている
- MenuPattern の状態マシンが新しいイベントを阻止している
-
クリック領域が遮られている
- 別のコンポーネントがメニューのクリック領域を覆っている
- ウィンドウの z-order に関する問題
-
イベントが消費されている
- 別のコンポーネントがクリックイベントをインターセプトしている
- タッチイベントがメニューに伝達されていない
デバッグ手順:
-
イベント登録を確認する
# 查找菜单事件相关日志 cat xxx.log | grep "OnClick" cat xxx.log | grep "GestureEventHub" -
メニューの状態を確認する
# 查找菜单状态 cat xxx.log | grep "MenuWrapper" cat xxx.log | grep "MenuState" -
ウィンドウの状態を確認する
# 查找子窗口状态 cat xxx.log | grep "ACE_SUB_WINDOW" cat xxx.log | grep "MenuWindowRect"
コードの場所:
menu_wrapper_pattern.cpp:OnDetach()- 状態遷移menu_pattern.cpp:OnClick- クリック処理menu_view.cpp:Create()- メニューの作成フロー
解決策:
-
イベントが正しく登録されていることを確認する
- GestureEventHub の初期化を確認します
- Pan イベントの登録を検証します
- イベントハブが正しく渡されていることを確認します
-
メニューの状態マシンを確認する
- OnModifyDone のタイミングを検証します
- Menu が阻止状態でないことを確認します
- isShowing_ の状態を確認します
-
クリック領域を検証する
- コンポーネントに遮られていないか確認します
- hitTestStack の設定を検証します
- タッチイベントが伝達されていることを確認します
-
デバッグログを追加する
// 在点击处理中添加日志 TAG_LOGI(AceLogTag::ACE_MENU, "OnClick called: menuId=%{public}d", menuId);
問題 2:メニューをクリックするとすぐに閉じる
症状:
- メニューを開くとすぐに閉じる
- メニューをクリックすると消える
- メニューが一瞬表示されてから消える
- "ShowMenu" の直後に "HideMenu" のログが表示される
考えられる原因:
-
状態マシンのエラー
- MenuWrapper の状態が ATTACHING と DETACHED の間で素早く切り替わる
- OnDetach が意図せず呼び出されている
- 状態遷移のロジックに欠陥がある
-
タッチイベントの競合
- クリックイベントが 2 回発生している
- Hide イベントと Show イベントが競合している
- Touch down と touch up のイベント処理に誤りがある
-
ウィンドウのフォーカスに関する問題
- ウィンドウがフォーカスを失い、メニューが閉じている
- フォーカス変更イベントによって非表示になっている
-
タイムアウト設定の誤り
- メニューのタイムアウト時間が 0 に設定されている
- Duration が短すぎてすぐに閉じている
デバッグ手順:
-
状態遷移ログを確認する
# 查找快速的状态变化 cat xxx.log | grep -E "ATTACHING|DETACHING" | head -20 -
HideMenu の呼び出しを確認する
# 查找谁调用了 HideMenu cat xxx.log | grep "HideMenu" | grep -B 5 "ShowMenu" -
タッチイベントを確認する
# 查找触摸事件 cat xxx.log | grep "Touch" cat xxx.log | grep "Click" -
ウィンドウのライフサイクルを確認する
# 查找子窗口创建和销毁 cat xxx.log | grep "GetOrCreateMenuSubWindow" cat xxx.log | grep "RemoveMenuSubWindow"
コードの場所:
menu_wrapper_pattern.cpp:OnDetach()- 状態管理menu_wrapper_pattern.cpp:HideMenu()- 非表示にするロジックmenu_pattern.cpp- 状態マシンの実装
解決策:
-
状態遷移のロジックを修正する
- 状態遷移ログを追加します
- 遷移条件のチェックを追加します
- 不正な状態遷移を防ぎます
-
イベント処理を最適化する
- イベントの重複排除ロジックを追加します
- Show/Hide の競合を防ぎます
- イベント処理に遅延を追加します
-
フォーカス管理を確認する
- ウィンドウのフォーカス設定を検証します
- フォーカスイベントの処理を確認します
- フォーカス状態のログを追加します
-
状態保護を強化する
// 添加状态检查 if (menuWrapperPattern->GetState() != MenuWrapperState::DETACHING) { TAG_LOGW(AceLogTag::ACE_MENU, "Invalid HideMenu call, current state=%{public}d", static_cast<int>(state)); return; }
問題 3:ポップアップメニューが画面左上に表示される(メニューの位置が左上になる)
症状:
- メニューが画面左上(0,0)に表示される
- メニューの位置が明らかにずれている
- メニューがトリガーに追従しない
- offset の計算が誤っている
考えられる原因:
-
Offset の計算が誤っている
- targetOffset の計算結果が 0 になっている
- PositionOffset が正しく設定されていない
- 初期位置にデフォルト値が使用されている
-
アンカーの設定が誤っている
- anchorPoint が設定されていない
- anchorPosition にデフォルト値が使用されている
- メニューが誤った位置にアンカーされている
-
MenuWindowRect の計算が誤っている
- GetMenuWindowRectInfo が誤った値を返している
- displayWindowRect の情報が誤っている
- 子ウィンドウのサイズの計算に失敗している
-
Placement の設定が反映されていない
- UpdateMenuPlacement が呼び出されていない
- placement プロパティが無視されている
- AlignRule の設定が誤っている
デバッグ手順:
-
位置関連のログを確認する
# 查找菜单位置计算 cat xxx.log | grep "MenuOffset" cat xxx.log | grep "MenuPosition" cat xxx.log | grep "targetOffset" -
ウィンドウ Rect の情報を確認する
# 查找窗口矩形 cat xxx.log | grep "MenuWindowRect" cat xxx.log | grep "DisplayWindowRectInfo" -
placement の設定を確認する
# 查找 placement 配置 cat xxx.log | grep "placement" cat xxx.log | grep "anchor"
コードの場所:
menu_layout_algorithm.cpp:3611-3659- GetMenuWindowRectInfomenu_layout_algorithm.cpp- Offset の計算menu_pattern.cpp- PositionOffset の更新menu_view.cpp:1627- UpdateMenuPlacement
解決策:
-
Offset の計算を検証する
- targetOffset が正しいか確認する
- positionOffset の取得元を検証する
- offset の計算ログを追加する
-
アンカーの設定を確認する
- anchorPoint の設定を検証する
- anchorPosition プロパティを確認する
- アンカーの計算ロジックを確認する
-
Placement を検証する
- UpdateMenuPlacement が呼び出されることを確認する
- AlignRule の設定を確認する
- placement の種類を検証する
-
位置のデバッグログを追加する
// 添加位置日志 TAG_LOGI(AceLogTag::ACE_MENU, "Menu position: offset=(%{public}f,%{public}f), target=(%{public}f,%{public}f)", offsetX, offsetY, targetOffsetX, targetOffsetY);
問題 4:メニューの表示方向が正しくない(メニューの方向が不正)
症状:
- メニューの方向が誤っている(上に表示されるはずが下に表示される)
- メニューの方向がトリガーと一致しない
- サブメニューの展開方向が誤っている
- メニューが誤った側に表示される
考えられる原因:
-
Direction パラメーターが誤っている
- fontSize または direction パラメーターの設定が誤っている
- menuDirection の列挙値が正しくない
- 矢印の描画方向が誤っている
-
Placement の計算が誤っている
- placement の種類の判定が誤っている
- Top/Bottom/Left/Right が混同されている
- AlignRule が正しく適用されていない
-
Target 位置の計算が誤っている
- トリガーの位置の取得に失敗している
- TargetOffset に誤った値が使用されている
- 相対位置の計算で符号が誤っている
-
レイアウトアルゴリズムの方向が誤っている
- Column/Row の方向設定が誤っている
- crossAxis の設定が誤っている
- mainAxisSize の設定が誤っている
デバッグ手順:
-
方向関連の設定を確認する
# 查找方向配置 cat xxx.log | grep -E "direction|font|arrow" -
placement の設定を確認する
cat xxx.log | grep "placement" cat xxx.log | grep "AlignDirection" -
レイアウトの方向を確認する
cat xxx.log | grep "mainAxisSize" cat xxx.log | grep "crossAxis"
コードの場所:
menu_pattern.cpp- Direction の設定menu_layout_algorithm.cpp- Placement の計算menu_item/- メニュー項目のレイアウト
解決策:
-
Direction パラメーターを検証する
- fontSize API の呼び出しを確認する
- 方向の列挙値を検証する
- 矢印の描画ロジックを確認する
-
Placement の計算を修正する
- placement の種類が正しいことを確認する
- Top/Bottom の判定ロジックを確認する
- 配置ルールを検証する
-
ターゲットの位置を確認する
- trigger コンポーネントの位置を検証する
- targetOffset の計算を確認する
- 相対位置の方向を確認する
-
方向のデバッグログを追加する
TAG_LOGI(AceLogTag::ACE_MENU, "Menu direction: placement=%{public}d, direction=%{public}d", placement, direction);
問題 5:メニューがノッチやナビゲーションバーを避けない(メニューがシステム UI と重なる)
症状:
- メニューがナビゲーションバーに隠れる
- メニューがステータスバーに重なる
- メニューがシステム UI のセーフエリアを考慮していない
- メニューの一部が画面外に表示される
考えられる原因:
-
SafeArea が適用されていない
- GetSafeArea() が呼び出されていない
- SafeArea の inset がレイアウトに渡されていない
- system_safe_area プロパティが設定されていない
-
Window Rect の計算が誤っている
- displayWindowRect がセーフエリアを考慮していない
- Window の位置とサイズの計算が誤っている
- Cutout state が適用されていない
-
Z-Order の問題
- メニューの window レイヤーが誤っている
- Window type が PANEL タイプではない
- Z-order の設定が正しくない
-
Maximize の設定が誤っている
- LayoutFullScreen が誤って使用されている
- Window mode が FLOATING ではなく FULLSCREEN に設定されている
- レイアウト制約の設定が誤っている
デバッグ手順:
-
SafeArea 関連のログを確認する
cat xxx.log | grep -i "safe|safeArea" -
Window Mode を確認する
cat xxx.log | grep "LayoutFullScreen" cat xxx.log | grep "WindowMode" -
Window Rect を確認する
cat xxx.log | grep "DisplayWindowRectInfo"
コードの場所:
subwindow_manager.cpp- Window の作成menu_layout_algorithm.cpp- SafeArea の適用- Menu wrapper - Window モードの設定
解決策:
-
SafeArea の制約を適用する
- GetSafeArea() が呼び出されることを確認する
- safe area をレイアウトアルゴリズムに渡す
- system_safe_area プロパティを設定する
-
Window Mode を調整する
- FLOATING または PANEL タイプを使用する
- FULLSCREEN モードを避ける
- 適切なウィンドウプロパティを設定する
-
Window Rect の計算を修正する
- ウィンドウの rect から safe area を差し引く
- メニューが表示領域内に収まるようにする
- cutout の処理を検証する
-
Z-Order を検証する
- window type の設定を確認する
- メニューが正しいレイヤーに表示されることを確認する
- システム UI との関係を検証する
問題 6:メニューの幅または高さが 0 になる(Menu Width/Height is 0)
症状:
- メニューの幅が 0 と計算される
- メニューの高さが 0 と計算される
- メニューが異常に狭く表示される、または表示されない
- displayWindowRectInfo が 0 の値を返す
考えられる原因:
-
非同期初期化が完了していない
- pipeline ready の前に GetDisplayWindowRectInfo が呼び出されている
- displayWindowRect がまだ初期化されていない
- 非同期で display 情報を取得するタイミングが誤っている
-
Pipeline Context の取得元が誤っている
- main window ではなく subwindow の context を使用している
- Context の型判定が誤っている
- PipelineContext の初期化タイミングに問題がある
-
MenuParam の設定が誤っている
- fontSize パラメーターが解析されていない
- MenuParam の受け渡しが誤っている
- 属性値が正しく設定されていない
-
計算式が誤っている
- menuMaxWidthRatio が 0 と計算される
- displayWidth に誤った係数を乗じている
- theme の戻り値の使用方法が誤っている
デバッグ手順:
-
displayWidth 関連のログを確認する
# 查找宽度计算 cat xxx.log | grep "displayWidth" cat xxx.log | grep "displayWindowRect.Width" cat xxx.log | grep "menuMaxWidthRatio" -
MenuParam を確認する
cat xxx.log | grep "MenuParam" cat xxx.log | grep "fontSize" -
Pipeline Context を確認する
cat xxx.log | grep "PipelineContext" cat xxx.log | grep "GetMainPipelineContext"
コードの場所:
menu_layout_algorithm.cpp:920-966- UpdateChildConstraintByDevicemenu_layout_algorithm.cpp:3618- GetMenuWindowRectInfomenu_pattern.cpp- MenuParam の処理- Theme 関連 - menuMaxWidthRatio の設定
解決策:
-
初期化チェックを追加する
// 在 GetMenuWindowRectInfo 中添加检查 auto displayWidth = displayWindowRectInfo.Width(); if (displayWidth <= 0.0f) { TAG_LOGE(AceLogTag::ACE_MENU, "Invalid displayWidth=%{public}f, waiting for async init", displayWidth); return menuWindowRect; } -
Context の取得元を検証する
- main window context を使用すべきかどうか確認する
- PipelineContext の型を検証する
- context の取得元に関するログを追加する
-
幅の計算を遅らせる
- 非同期初期化が完了する前は、デフォルトの幅を使用する
- ready 状態のチェックを追加する
- 未初期化の値を使用しないようにする
-
非同期初期化のログを追加する
TAG_LOGI(AceLogTag::ACE_MENU, "Async display init: displayWidth=%{public}f, ready=%{public}d", displayWidth, IsDisplayReady());
ログ強化の参考資料
主なログパターン
1. 状態遷移のログ
TAG_LOGI(AceLogTag::ACE_SUB_WINDOW,
"Subwindow state transition: %{public}d -> %{public}d",
static_cast<int>(oldState), static_cast<int>(newState));
2. 値のコンテキストのログ
TAG_LOGI(AceLogTag::ACE_MENU,
"Calculation: displayWidth=%{public}f, menuMaxWidthRatio=%{public}f, result=%{public}f",
displayWidth, menuMaxWidthRatio, menuMaxWidth);
3. コードパスのログ
TAG_LOGI(AceLogTag::ACE_MENU,
"GetMenuWindowRectInfo: host=%{public}p, menuId=%{public}d, targetTag=%{public}d, targetNodeId=%{public}d",
host.Get(), menuPattern->GetMenuId(), targetTag_, targetNodeId_);
4. エラーコンテキストのログ
if (displayWidth <= 0.0f) {
TAG_LOGE(AceLogTag::ACE_MENU,
"Invalid displayWidth=%{public}f, expected>%{public}f",
displayWidth, expectedWidth);
return;
}
ログに記録する重要な変数
幅/高さの問題の場合:
displayWindowRectInfo.Width()/Height()menuMaxWidth/menuMaxHeightmenuMaxWidthRatio/menuMaxHeightRatiotheme->GetMenuMaxWidthRatio()pipeline->GetDisplayWindowRectInfo()
サブウィンドウの問題の場合:
subwindow->GetDetachState()subwindow->GetShown()subwindow->GetRect().GetSize()instanceId/searchKey.ToString()
レイアウトの問題の場合:
menuWindowRect(すべてのフィールド)targetOffset_/targetSize_GetMenuWindowRectInfo()の戻り値placement/anchorPosition
コードの場所のクイックリファレンス
| 問題の種類 | ファイル | 行 | 関数 | 主な変数 |
|---|---|---|---|---|
| クリックの問題 | menu_wrapper_pattern.cpp | - | OnDetach / OnAttach | state_ |
| 自動クローズ | menu_pattern.cpp | - | 状態マシン | isShowing_ |
| 位置(左上) | menu_layout_algorithm.cpp | 3611-3659 | GetMenuWindowRectInfo | menuWindowRect |
| 方向 | menu_pattern.cpp | - | direction_ / placement | - |
| セーフエリア | subwindow_manager.cpp | - | ウィンドウ作成パラメーター | - |
| 幅=0/高さ=0 | menu_layout_algorithm.cpp | 920-966 | UpdateChildConstraintByDevice | displayWidth |
ログのフィルタリングコマンド
Menu 関連のログをすべて抽出する:
# Comprehensive Menu logs
grep -E "ACE_MENU|ACE_SUB_WINDOW|ACE_OVERLAY" xxx.log > menu_debug.log
# Width-specific logs
grep -E "DisplayWindowRectInfo|menuMaxWidth|displayWidth" xxx.log
# Subwindow recreation logs
grep -E "recreate subwindow|DETACHING|MenuWindowState" xxx.log
# Positioning logs
grep -E "MenuOffset|MenuPosition|targetOffset|placement" xxx.log
# Click/Event logs
grep -E "OnClick|TouchEvent|GestureEvent" xxx.log
特定のインスタンスでフィルタリングする:
# For specific container ID
grep "instanceId: 123" xxx.log
# For specific menu node
grep "menuId: 456" xxx.log
ベストプラクティス
ログ強化の原則
推奨事項:
- ✅ コンテキストを追加する — 関連する変数の値を記録する
- ✅ 状態遷移を記録する — old → new
- ✅ 適切なログレベルを使用する — 通常時は INFO、想定外の状況では WARN、失敗時は ERROR
- ✅ 識別子を含める — ノード ID、インスタンス ID
- ✅ 計算を記録する — 入力値と結果
- ✅ 変更を最小限にする — ログの追加のみを行い、ロジックは変更しない
- ✅ 既存のマクロを使用する — 適切なタグを指定した TAG_LOGI/W/E
- ✅ コンパイルをテストする — 適用する前に構文を確認する
- ✅ 変更内容を記録する — 各ログを追加した理由と内容を記す
禁止事項:
- ❌ コンテキストなしでログを記録する — 「entered function」だけを記録する
- ❌ 過剰にログを記録する — ループ内で大量のログを出力する
- ❌ 機密データを記録する — ユーザー情報、トークン
- ❌ 推測する — 実際の値のみを記録する
- ❌ ロジックを変更する — ログ文の追加のみを行う
パッチ生成のガイドライン
- 変更を最小限にする — ログの追加のみを行い、ロジックは変更しない
- 書式を維持する — 既存のコードスタイルに従う
- 既存のマクロを使用する — 適切なタグを指定した TAG_LOGI/W/E
- コンパイルをテストする — 適用する前に構文を確認する
- 変更内容を記録する — 各ログを追加した理由と内容を記す
- コンテキストを含めてログを記録する — 周辺のコードの状態をログに含める
分析ワークフロー
- ベースラインを収集 - 可能であれば、問題が発生していない状態のログを収集します
- パッチを適用 - 対象を絞ったログ出力を追加します
- 問題を再現 - ログ出力を強化した状態で問題を発生させます
- 関連ログを抽出 - 特定のログタグでフィルタリングします
- 実行フローを追跡 - コード内のログの順序をたどります
- 根本原因を特定 - 想定外の動作が発生している箇所を見つけます
- 修正を実装 - 特定した問題に対処します
- 解決を検証 - 修正が機能することを確認し、必要に応じてデバッグログを削除します
他のスキルとの連携
このスキルは、以下のスキルを補完します:
- compile-analysis - Menu コードのパフォーマンス問題に使用します
- build-error-analyzer - Menu の変更によってビルドが失敗した場合に使用します
- xts-component-test - Menu のテストケース作成に使用します
バージョン履歴
-
0.2.0 (2026-02-12):よくある問題の分析を6件追加
- 💫 クリックしても反応しない問題の分析を追加
- 💫 メニューが自動的に閉じる問題の分析を追加
- 💫 メニューが左上隅に表示される問題の分析を追加
- 💫 メニューの方向が正しくない問題の分析を追加
- 💫 メニューがナビゲーションバーを避けない問題の分析を追加
- 💫 幅/高さが0になる問題の分析を追加
- 📝 各問題に詳細なデバッグ手順と解決策を提供
- 🎯 よくあるユーザーの問題を網羅するよう、トリガーキーワードを拡充
-
0.1.0 (2026-02-12):初期バージョン
- ✨ Menu コンポーネントを完全にデバッグするスキル
- 📝 幅、子ウィンドウ、レイアウト、クラッシュなど、4種類の問題を網羅
- 🔧 体系的なデバッグワークフローを提供
- 📊 重要なコードの位置と変数のリファレンスを収録
- 🎯 ログ強化パッチの生成を自動化