mcpField
M
menu-debug

menu-debug

github.com/openharmonyinsight開発3575 回インストール11 週間前に更新
リポジトリ

menu-debug について

menu-debugは、OpenHarmony ACE EngineのMenuコンポーネントを調査する開発者向けのデバッグスキルです。症状を分類し、コードの位置やログの確認方法、ログパッチの指針を示します。

主な機能

  1. 01Menuの症状別分類
  2. 02関連コード位置の特定
  3. 03既存ログの確認手順
  4. 04コード分析に基づくログパッチ指針

活用シーン

  1. 01メニューのサイズやレイアウト不具合の調査
  2. 02サブウィンドウ再生成やクラッシュの分析
  3. 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 - UpdateChildConstraintByDevice
  • menu_layout_algorithm.cpp:3618 - GetMenuWindowRectInfo
  • menu_layout_algorithm.cpp:931 - パイプラインコンテキストのソース
  • menu_pattern.cpp - メニューラッパーの初期化

サブウィンドウの問題の場合:

  • subwindow_manager.cpp:1954 - GetOrCreateMenuSubWindow
  • subwindow_manager.cpp:1965 - 再作成ログ
  • menu_wrapper_pattern.cpp - メニューラッパーのライフサイクル

レイアウトの問題の場合:

  • menu_layout_algorithm.cpp:3611-3659 - GetMenuWindowRectInfo
  • menu_pattern.cpp - メニューの位置決め
  • multi_menu_layout_algorithm.cpp - マルチメニューのレイアウト

クリック/自動クローズの問題の場合:

  • menu_wrapper_pattern.cpp - OnDetach/OnAttach
  • menu_pattern.cpp - メニューの状態管理
  • menu_view.cpp - イベント処理

位置の問題の場合:

  • menu_layout_algorithm.cpp - GetMenuWindowRectInfo
  • menu_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:クリックしても反応しない/クリックしてもメニューが表示されない

症状:

  • メニューのトリガーをクリックしても反応しない
  • クリックしてもメニューが表示されない
  • エラーログがまったくない
  • クリックイベントが無視されているように見える

考えられる原因:

  1. イベントハブが正しく初期化されていない

    • GestureEventHub を取得または作成できていない
    • Pan イベントがメニューコンポーネントに登録されていない
  2. メニューの状態が正しくない

    • MenuWrapper が DETACHING 状態になっている
    • MenuPattern の状態マシンが新しいイベントを阻止している
  3. クリック領域が遮られている

    • 別のコンポーネントがメニューのクリック領域を覆っている
    • ウィンドウの z-order に関する問題
  4. イベントが消費されている

    • 別のコンポーネントがクリックイベントをインターセプトしている
    • タッチイベントがメニューに伝達されていない

デバッグ手順:

  1. イベント登録を確認する

    # 查找菜单事件相关日志
    cat xxx.log | grep "OnClick"
    cat xxx.log | grep "GestureEventHub"
    
  2. メニューの状態を確認する

    # 查找菜单状态
    cat xxx.log | grep "MenuWrapper"
    cat xxx.log | grep "MenuState"
    
  3. ウィンドウの状態を確認する

    # 查找子窗口状态
    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() - メニューの作成フロー

解決策:

  1. イベントが正しく登録されていることを確認する

    • GestureEventHub の初期化を確認します
    • Pan イベントの登録を検証します
    • イベントハブが正しく渡されていることを確認します
  2. メニューの状態マシンを確認する

    • OnModifyDone のタイミングを検証します
    • Menu が阻止状態でないことを確認します
    • isShowing_ の状態を確認します
  3. クリック領域を検証する

    • コンポーネントに遮られていないか確認します
    • hitTestStack の設定を検証します
    • タッチイベントが伝達されていることを確認します
  4. デバッグログを追加する

    // 在点击处理中添加日志
    TAG_LOGI(AceLogTag::ACE_MENU, "OnClick called: menuId=%{public}d", menuId);
    

問題 2:メニューをクリックするとすぐに閉じる

症状:

  • メニューを開くとすぐに閉じる
  • メニューをクリックすると消える
  • メニューが一瞬表示されてから消える
  • "ShowMenu" の直後に "HideMenu" のログが表示される

考えられる原因:

  1. 状態マシンのエラー

    • MenuWrapper の状態が ATTACHING と DETACHED の間で素早く切り替わる
    • OnDetach が意図せず呼び出されている
    • 状態遷移のロジックに欠陥がある
  2. タッチイベントの競合

    • クリックイベントが 2 回発生している
    • Hide イベントと Show イベントが競合している
    • Touch down と touch up のイベント処理に誤りがある
  3. ウィンドウのフォーカスに関する問題

    • ウィンドウがフォーカスを失い、メニューが閉じている
    • フォーカス変更イベントによって非表示になっている
  4. タイムアウト設定の誤り

    • メニューのタイムアウト時間が 0 に設定されている
    • Duration が短すぎてすぐに閉じている

デバッグ手順:

  1. 状態遷移ログを確認する

    # 查找快速的状态变化
    cat xxx.log | grep -E "ATTACHING|DETACHING" | head -20
    
  2. HideMenu の呼び出しを確認する

    # 查找谁调用了 HideMenu
    cat xxx.log | grep "HideMenu" | grep -B 5 "ShowMenu"
    
  3. タッチイベントを確認する

    # 查找触摸事件
    cat xxx.log | grep "Touch"
    cat xxx.log | grep "Click"
    
  4. ウィンドウのライフサイクルを確認する

    # 查找子窗口创建和销毁
    cat xxx.log | grep "GetOrCreateMenuSubWindow"
    cat xxx.log | grep "RemoveMenuSubWindow"
    

コードの場所:

  • menu_wrapper_pattern.cpp:OnDetach() - 状態管理
  • menu_wrapper_pattern.cpp:HideMenu() - 非表示にするロジック
  • menu_pattern.cpp - 状態マシンの実装

解決策:

  1. 状態遷移のロジックを修正する

    • 状態遷移ログを追加します
    • 遷移条件のチェックを追加します
    • 不正な状態遷移を防ぎます
  2. イベント処理を最適化する

    • イベントの重複排除ロジックを追加します
    • Show/Hide の競合を防ぎます
    • イベント処理に遅延を追加します
  3. フォーカス管理を確認する

    • ウィンドウのフォーカス設定を検証します
    • フォーカスイベントの処理を確認します
    • フォーカス状態のログを追加します
  4. 状態保護を強化する

    // 添加状态检查
    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 の計算が誤っている

考えられる原因:

  1. Offset の計算が誤っている

    • targetOffset の計算結果が 0 になっている
    • PositionOffset が正しく設定されていない
    • 初期位置にデフォルト値が使用されている
  2. アンカーの設定が誤っている

    • anchorPoint が設定されていない
    • anchorPosition にデフォルト値が使用されている
    • メニューが誤った位置にアンカーされている
  3. MenuWindowRect の計算が誤っている

    • GetMenuWindowRectInfo が誤った値を返している
    • displayWindowRect の情報が誤っている
    • 子ウィンドウのサイズの計算に失敗している
  4. Placement の設定が反映されていない

    • UpdateMenuPlacement が呼び出されていない
    • placement プロパティが無視されている
    • AlignRule の設定が誤っている

デバッグ手順:

  1. 位置関連のログを確認する

    # 查找菜单位置计算
    cat xxx.log | grep "MenuOffset"
    cat xxx.log | grep "MenuPosition"
    cat xxx.log | grep "targetOffset"
    
  2. ウィンドウ Rect の情報を確認する

    # 查找窗口矩形
    cat xxx.log | grep "MenuWindowRect"
    cat xxx.log | grep "DisplayWindowRectInfo"
    
  3. placement の設定を確認する

    # 查找 placement 配置
    cat xxx.log | grep "placement"
    cat xxx.log | grep "anchor"
    

コードの場所:

  • menu_layout_algorithm.cpp:3611-3659 - GetMenuWindowRectInfo
  • menu_layout_algorithm.cpp - Offset の計算
  • menu_pattern.cpp - PositionOffset の更新
  • menu_view.cpp:1627 - UpdateMenuPlacement

解決策:

  1. Offset の計算を検証する

    • targetOffset が正しいか確認する
    • positionOffset の取得元を検証する
    • offset の計算ログを追加する
  2. アンカーの設定を確認する

    • anchorPoint の設定を検証する
    • anchorPosition プロパティを確認する
    • アンカーの計算ロジックを確認する
  3. Placement を検証する

    • UpdateMenuPlacement が呼び出されることを確認する
    • AlignRule の設定を確認する
    • placement の種類を検証する
  4. 位置のデバッグログを追加する

    // 添加位置日志
    TAG_LOGI(AceLogTag::ACE_MENU,
        "Menu position: offset=(%{public}f,%{public}f), target=(%{public}f,%{public}f)",
        offsetX, offsetY, targetOffsetX, targetOffsetY);
    

問題 4:メニューの表示方向が正しくない(メニューの方向が不正)

症状:

  • メニューの方向が誤っている(上に表示されるはずが下に表示される)
  • メニューの方向がトリガーと一致しない
  • サブメニューの展開方向が誤っている
  • メニューが誤った側に表示される

考えられる原因:

  1. Direction パラメーターが誤っている

    • fontSize または direction パラメーターの設定が誤っている
    • menuDirection の列挙値が正しくない
    • 矢印の描画方向が誤っている
  2. Placement の計算が誤っている

    • placement の種類の判定が誤っている
    • Top/Bottom/Left/Right が混同されている
    • AlignRule が正しく適用されていない
  3. Target 位置の計算が誤っている

    • トリガーの位置の取得に失敗している
    • TargetOffset に誤った値が使用されている
    • 相対位置の計算で符号が誤っている
  4. レイアウトアルゴリズムの方向が誤っている

    • Column/Row の方向設定が誤っている
    • crossAxis の設定が誤っている
    • mainAxisSize の設定が誤っている

デバッグ手順:

  1. 方向関連の設定を確認する

    # 查找方向配置
    cat xxx.log | grep -E "direction|font|arrow"
    
  2. placement の設定を確認する

    cat xxx.log | grep "placement"
    cat xxx.log | grep "AlignDirection"
    
  3. レイアウトの方向を確認する

    cat xxx.log | grep "mainAxisSize"
    cat xxx.log | grep "crossAxis"
    

コードの場所:

  • menu_pattern.cpp - Direction の設定
  • menu_layout_algorithm.cpp - Placement の計算
  • menu_item/ - メニュー項目のレイアウト

解決策:

  1. Direction パラメーターを検証する

    • fontSize API の呼び出しを確認する
    • 方向の列挙値を検証する
    • 矢印の描画ロジックを確認する
  2. Placement の計算を修正する

    • placement の種類が正しいことを確認する
    • Top/Bottom の判定ロジックを確認する
    • 配置ルールを検証する
  3. ターゲットの位置を確認する

    • trigger コンポーネントの位置を検証する
    • targetOffset の計算を確認する
    • 相対位置の方向を確認する
  4. 方向のデバッグログを追加する

    TAG_LOGI(AceLogTag::ACE_MENU,
        "Menu direction: placement=%{public}d, direction=%{public}d",
        placement, direction);
    

問題 5:メニューがノッチやナビゲーションバーを避けない(メニューがシステム UI と重なる)

症状:

  • メニューがナビゲーションバーに隠れる
  • メニューがステータスバーに重なる
  • メニューがシステム UI のセーフエリアを考慮していない
  • メニューの一部が画面外に表示される

考えられる原因:

  1. SafeArea が適用されていない

    • GetSafeArea() が呼び出されていない
    • SafeArea の inset がレイアウトに渡されていない
    • system_safe_area プロパティが設定されていない
  2. Window Rect の計算が誤っている

    • displayWindowRect がセーフエリアを考慮していない
    • Window の位置とサイズの計算が誤っている
    • Cutout state が適用されていない
  3. Z-Order の問題

    • メニューの window レイヤーが誤っている
    • Window type が PANEL タイプではない
    • Z-order の設定が正しくない
  4. Maximize の設定が誤っている

    • LayoutFullScreen が誤って使用されている
    • Window mode が FLOATING ではなく FULLSCREEN に設定されている
    • レイアウト制約の設定が誤っている

デバッグ手順:

  1. SafeArea 関連のログを確認する

    cat xxx.log | grep -i "safe|safeArea"
    
  2. Window Mode を確認する

    cat xxx.log | grep "LayoutFullScreen"
    cat xxx.log | grep "WindowMode"
    
  3. Window Rect を確認する

    cat xxx.log | grep "DisplayWindowRectInfo"
    

コードの場所:

  • subwindow_manager.cpp - Window の作成
  • menu_layout_algorithm.cpp - SafeArea の適用
  • Menu wrapper - Window モードの設定

解決策:

  1. SafeArea の制約を適用する

    • GetSafeArea() が呼び出されることを確認する
    • safe area をレイアウトアルゴリズムに渡す
    • system_safe_area プロパティを設定する
  2. Window Mode を調整する

    • FLOATING または PANEL タイプを使用する
    • FULLSCREEN モードを避ける
    • 適切なウィンドウプロパティを設定する
  3. Window Rect の計算を修正する

    • ウィンドウの rect から safe area を差し引く
    • メニューが表示領域内に収まるようにする
    • cutout の処理を検証する
  4. Z-Order を検証する

    • window type の設定を確認する
    • メニューが正しいレイヤーに表示されることを確認する
    • システム UI との関係を検証する

問題 6:メニューの幅または高さが 0 になる(Menu Width/Height is 0)

症状:

  • メニューの幅が 0 と計算される
  • メニューの高さが 0 と計算される
  • メニューが異常に狭く表示される、または表示されない
  • displayWindowRectInfo が 0 の値を返す

考えられる原因:

  1. 非同期初期化が完了していない

    • pipeline ready の前に GetDisplayWindowRectInfo が呼び出されている
    • displayWindowRect がまだ初期化されていない
    • 非同期で display 情報を取得するタイミングが誤っている
  2. Pipeline Context の取得元が誤っている

    • main window ではなく subwindow の context を使用している
    • Context の型判定が誤っている
    • PipelineContext の初期化タイミングに問題がある
  3. MenuParam の設定が誤っている

    • fontSize パラメーターが解析されていない
    • MenuParam の受け渡しが誤っている
    • 属性値が正しく設定されていない
  4. 計算式が誤っている

    • menuMaxWidthRatio が 0 と計算される
    • displayWidth に誤った係数を乗じている
    • theme の戻り値の使用方法が誤っている

デバッグ手順:

  1. displayWidth 関連のログを確認する

    # 查找宽度计算
    cat xxx.log | grep "displayWidth"
    cat xxx.log | grep "displayWindowRect.Width"
    cat xxx.log | grep "menuMaxWidthRatio"
    
  2. MenuParam を確認する

    cat xxx.log | grep "MenuParam"
    cat xxx.log | grep "fontSize"
    
  3. Pipeline Context を確認する

    cat xxx.log | grep "PipelineContext"
    cat xxx.log | grep "GetMainPipelineContext"
    

コードの場所:

  • menu_layout_algorithm.cpp:920-966 - UpdateChildConstraintByDevice
  • menu_layout_algorithm.cpp:3618 - GetMenuWindowRectInfo
  • menu_pattern.cpp - MenuParam の処理
  • Theme 関連 - menuMaxWidthRatio の設定

解決策:

  1. 初期化チェックを追加する

    // 在 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;
    }
    
  2. Context の取得元を検証する

    • main window context を使用すべきかどうか確認する
    • PipelineContext の型を検証する
    • context の取得元に関するログを追加する
  3. 幅の計算を遅らせる

    • 非同期初期化が完了する前は、デフォルトの幅を使用する
    • ready 状態のチェックを追加する
    • 未初期化の値を使用しないようにする
  4. 非同期初期化のログを追加する

    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 / menuMaxHeight
  • menuMaxWidthRatio / menuMaxHeightRatio
  • theme->GetMenuMaxWidthRatio()
  • pipeline->GetDisplayWindowRectInfo()

サブウィンドウの問題の場合:

  • subwindow->GetDetachState()
  • subwindow->GetShown()
  • subwindow->GetRect().GetSize()
  • instanceId / searchKey.ToString()

レイアウトの問題の場合:

  • menuWindowRect(すべてのフィールド)
  • targetOffset_ / targetSize_
  • GetMenuWindowRectInfo() の戻り値
  • placement / anchorPosition

コードの場所のクイックリファレンス

問題の種類ファイル行関数主な変数
クリックの問題menu_wrapper_pattern.cpp-OnDetach / OnAttachstate_
自動クローズmenu_pattern.cpp-状態マシンisShowing_
位置(左上)menu_layout_algorithm.cpp3611-3659GetMenuWindowRectInfomenuWindowRect
方向menu_pattern.cpp-direction_ / placement-
セーフエリアsubwindow_manager.cpp-ウィンドウ作成パラメーター-
幅=0/高さ=0menu_layout_algorithm.cpp920-966UpdateChildConstraintByDevicedisplayWidth

ログのフィルタリングコマンド

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」だけを記録する
  • ❌ 過剰にログを記録する — ループ内で大量のログを出力する
  • ❌ 機密データを記録する — ユーザー情報、トークン
  • ❌ 推測する — 実際の値のみを記録する
  • ❌ ロジックを変更する — ログ文の追加のみを行う
パッチ生成のガイドライン
  1. 変更を最小限にする — ログの追加のみを行い、ロジックは変更しない
  2. 書式を維持する — 既存のコードスタイルに従う
  3. 既存のマクロを使用する — 適切なタグを指定した TAG_LOGI/W/E
  4. コンパイルをテストする — 適用する前に構文を確認する
  5. 変更内容を記録する — 各ログを追加した理由と内容を記す
  6. コンテキストを含めてログを記録する — 周辺のコードの状態をログに含める
分析ワークフロー
  1. ベースラインを収集 - 可能であれば、問題が発生していない状態のログを収集します
  2. パッチを適用 - 対象を絞ったログ出力を追加します
  3. 問題を再現 - ログ出力を強化した状態で問題を発生させます
  4. 関連ログを抽出 - 特定のログタグでフィルタリングします
  5. 実行フローを追跡 - コード内のログの順序をたどります
  6. 根本原因を特定 - 想定外の動作が発生している箇所を見つけます
  7. 修正を実装 - 特定した問題に対処します
  8. 解決を検証 - 修正が機能することを確認し、必要に応じてデバッグログを削除します

他のスキルとの連携

このスキルは、以下のスキルを補完します:

  • 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種類の問題を網羅
    • 🔧 体系的なデバッグワークフローを提供
    • 📊 重要なコードの位置と変数のリファレンスを収録
    • 🎯 ログ強化パッチの生成を自動化

コメント