在macOS上调试Vulkan验证层

时间:2018-06-30 22:54:13

标签: xcode macos cmake vulkan

我正在试用适用于macOS的LunarG vulkan SDK。到目前为止一切都很好。但是,在调试验证层时,我很费力,因为我找不到解决方案以升级到层代码以对其进行调试。我有简单的CMake设置,对于非常简单的项目,除了查询层,扩展和类似的东西外,基本上什么都不做。这是我的顶级CMakeLists.txt:

cmake_minimum_required(VERSION 3.7)
project(TestApp)
find_package(vulkan REQUIRED)

set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)

set(MACOS_APPLICATION_SRCS
    ${CMAKE_CURRENT_SOURCE_DIR}/Demo.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/main.mm
    ${CMAKE_CURRENT_SOURCE_DIR}/Application.mm
    ${CMAKE_CURRENT_SOURCE_DIR}/DemoViewController.mm
)

set(MACOS_APPLICATION_HEADERS
    ${CMAKE_CURRENT_SOURCE_DIR}/Demo.h
    ${CMAKE_CURRENT_SOURCE_DIR}/Application.h
    ${CMAKE_CURRENT_SOURCE_DIR}/DemoViewController.h
)

set(MACOS_APPLICATION_RESOURCES
    ${CMAKE_CURRENT_SOURCE_DIR}/Main.storyboard
)

add_definitions(-DVK_USE_PLATFORM_MACOS_MVK)
include_directories(./)

add_executable(TestApp MACOSX_BUNDLE
    ${MACOS_APPLICATION_HEADERS}
    ${MACOS_APPLICATION_SRCS}
    ${MACOS_APPLICATION_RESOURCES})

target_link_libraries(TestApp Vulkan::Vulkan "-framework AppKit -framework QuartzCore")

set_target_properties(TestApp PROPERTIES
    MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist
)

set_source_files_properties(${MACOS_APPLICATION_RESOURCES} PROPERTIES
    MACOSX_PACKAGE_LOCATION "Resources"
)

我正在创建捆绑的应用程序,但是现在我不在捆绑中存储任何资源(vulkan loader,meltvk lib,用于层和icd的清单文件)。我刚刚添加了环境。 Xcode中的变量(VK_ICD_FILENAMES,VK_LAYER_PATH),因此它们指向sdk和layers变量随附的melt的icd清单文件,并指向layers文件夹。我尝试使用Debug配置自己构建图层,所以我的VK_LAYER_PATH指向清单文件所在的图层构建文件夹。通过这种设置,当我运行我的应用程序时,一切正常,加载了层并且正确调用了我的调试回调。但是,当我尝试进入图层时,什么也没发生,好像xcode找不到图层的符号。我猜那没关系,但是后来我尝试将VK_LAYER_PATH设置为指向我也已构建的cubepp演示项目中的图层构建文件夹。然后,我能够进入分层代码,这使我认为xcode找不到符号可能不是问题。但是,我对cubepp CMakeLists.txt进行了一些更改,以查找我的项目中可能缺少的属性,但是在更改之后,即使我将更改恢复为CMakeLists,也无法再次进入层代码。我猜这可能是XCode问题,或者我缺少一些@rpath等设置,但是这些东西以及macOS平台对我来说都是新的。有什么想法我应该如何设置才能正常工作?

谢谢

1 个答案:

答案 0 :(得分:0)

请记住,当尝试从应用程序进入各层时,您必须首先逐步通过该加载器,因为该加载器位于应用程序和各层之间。我怀疑您捆绑的应用程序链接到了没有调试符号而构建的加载程序,这就是为什么您无法介入其中的原因。

cubepp之所以起作用,是因为它可能(通过rpath)链接到了可调试构建的加载器。

我在以下方面取得了一些成功

  • 以Debug模式在KhronosGroup / Vulkan-ValidationLayers存储库中构建图层
  • 在我的XCode项目方案中将VK_LAYER_PATH设置为此仓库的层构建目录
  • 在Xcode中设置符号断点(例如,libVkLayer_core_validation.dylib中的CreateInstance)

这将导致XCode停止在调试器中并显示该层的完整源代码。

另一种方法是将您的应用程序与可调试构建的加载器链接。