已获取有效指针,但vkDebugMarkerSetObjectNameEXT调用崩溃求助
解决vkDebugMarkerSetObjectNameEXT调用崩溃的问题
核心问题:
vkDebugMarkerSetObjectNameEXT是旧版VK_EXT_debug_marker扩展的函数,并非你启用的VK_EXT_debug_utils的一部分。你通过vkGetInstanceProcAddr拿到的指针看似有效,但该函数的实际执行依赖设备是否启用了旧扩展,而你没加载VK_EXT_debug_marker,导致调用时内部逻辑出错,表现为空指针崩溃。正确解决方案:既然你已经在使用
VK_EXT_debug_utils扩展(比如vkCmdBeginDebugUtilsLabelEXT),直接用该扩展提供的**vkSetDebugUtilsObjectNameEXT**即可,这是替代旧函数的标准接口,兼容性更好,用法也和你现有的调试工具逻辑统一。具体步骤:
- 通过
vkGetDeviceProcAddr获取函数指针:PFN_vkSetDebugUtilsObjectNameEXT pfn_vkSetDebugUtilsObjectNameEXT = (PFN_vkSetDebugUtilsObjectNameEXT)vkGetDeviceProcAddr(vulkanDevice, "vkSetDebugUtilsObjectNameEXT"); - 调用时构造
VkDebugUtilsObjectNameInfoEXT结构体(比旧的VkDebugMarkerObjectNameInfoEXT多了objectType的明确枚举,更清晰):VkDebugUtilsObjectNameInfoEXT nameInfo{}; nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; nameInfo.objectType = VK_OBJECT_TYPE_BUFFER; // 替换为你要命名的对象类型 nameInfo.objectHandle = (uint64_t)yourBuffer; // 替换为目标对象的句柄 nameInfo.pObjectName = "MyLeakTrackingBuffer"; // 自定义名称 if (pfn_vkSetDebugUtilsObjectNameEXT != nullptr) { pfn_vkSetDebugUtilsObjectNameEXT(vulkanDevice, &nameInfo); }
- 通过
补充说明:部分驱动可能会通过实例proc addr暴露旧的debug marker函数,但这属于非标准兼容行为,调用时因为缺少设备级扩展的支持,必然会出现异常。坚持使用
VK_EXT_debug_utils下的新接口才是可靠的做法。
内容的提问来源于stack exchange,提问作者Varrak
相关产品推荐
相关产品推荐

