How to get prefab path from prefab game object?

[InitializeOnLoad]
public static class SavePrefabFile
{
    static SavePrefabFile()
    {
        PrefabStage.prefabSaved += OnPrefabSaved;
    }

    static void OnPrefabSaved(GameObject prefab)
    {
        // path is empty? how can I get the right path from prefab?
        var path = AssetDatabase.GetAssetPath(prefab);
    }
}

it must be something wrong with PrefabStage.prefabSaved callback, since PrefabUtility.prefabInstanceUpdated works well.

        static SavePrefabFile()
        {
            // PrefabStage.prefabSaved -= OnPrefabSaved;
            // PrefabStage.prefabSaved += OnPrefabSaved;
            PrefabUtility.prefabInstanceUpdated += OnPrefabSaved;
        }

        static void OnPrefabSaved(GameObject prefab)
        {
            // all those value were null if use callback of `PrefabState.prefabSaved`
            var PrefabInstanceHandle = PrefabUtility.GetPrefabInstanceHandle(prefab);
            var CorrespondingObjectFromSource = PrefabUtility.GetCorrespondingObjectFromSource(prefab);
            var OutermostPrefabInstanceRoot = PrefabUtility.GetOutermostPrefabInstanceRoot(prefab);
            var NearestPrefabInstanceRoot = PrefabUtility.GetNearestPrefabInstanceRoot(prefab);
            var CorrespondingObjectFromOriginalSource = PrefabUtility.GetCorrespondingObjectFromOriginalSource(prefab);
            var path = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(prefab);
        }
    void Start()
    {
#if UNITY_EDITOR
        // Assuming you have a reference to the prefab game object
        GameObject prefabGameObject = gameObject;

        // Get the prefab path
        string prefabPath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(prefabGameObject);

        Debug.Log("Prefab Path: " + prefabPath);
#endif
    }

@quabug

Try:

    static void OnPrefabSaved(GameObject prefabRoot)
    {
        var prefabStage = (PrefabStage)StageUtility.GetStage(prefabRoot);
        var path = prefabStage.assetPath;
    }