【问题标题】:vkCreateInstance causing a segmentation faultvkCreateInstance 导致分段错误
【发布时间】:2017-01-12 02:20:19
【问题描述】:

我刚刚开始学习 Vulkan。我有 Graham Sellers 的《Vulkan Programming Guide》一书,以及我系统中带有 AMDGPU pro 驱动程序的 RX 480。我正在运行 Arch Linux,并且已经能够在我的系统上运行一些 Vulkan 演示。

我有一个导致分段错误的最小代码块。奇怪的是,在我为了提出这个问题而生成这个块的过程中,我确实让它在从构造函数调用 vkCreateInstance() 的情况下运行,并且当我在我的代码中添加一个 try/catch 时首先注意到一个分段错误。

现在,即使没有 try/catch,这也会导致分段错误:

#include <iostream>
#include <vulkan/vulkan.h>

int main(int argv, char* argc[])
{
    VkInstance* instance;
    VkApplicationInfo appInfo = { .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
                                  .pNext = NULL,
                                  .pApplicationName = "Step 1",
                                  .applicationVersion = 1,
                                  .pEngineName = NULL,
                                  .engineVersion = 0,
                                  .apiVersion = VK_MAKE_VERSION(1, 0, 26) }; //This is what vulkanCapsViewer says my API version is.

    VkInstanceCreateInfo createInfo = { .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
                                        .pNext = NULL,
                                        .flags = 0 };
    createInfo.pApplicationInfo = &appInfo;
    createInfo.enabledExtensionCount = 0;
    createInfo.ppEnabledExtensionNames = NULL;
    createInfo.enabledLayerCount = 0;
    createInfo.ppEnabledLayerNames = NULL;

    std::cout << "1\n";
    VkResult result = vkCreateInstance(&createInfo, NULL, instance);
    std::cout << "2\n";
    if(result != VK_SUCCESS) std::cout << "Failed to create a Vulkan instance: " << result << std::endl;
    std::cout << "3\n";
    return 0;
}

输出是:

93> ./create_seg_fault 
1
Segmentation fault (core dumped)

【问题讨论】:

  • 指定初始化器(还不是)C++ 特性。所以你的代码使用了一些 C 和 C++ 的混合体。

标签: c++ vulkan


【解决方案1】:

vkCreateInstance 期望指向它将填充的已分配对象的指针,您只是给它一个指向无处的指针(在调试中可能为 0,在发布时将是垃圾),测试它 - 在堆栈上创建对象并给出它的地址:

  VkInstance instance;
  ...
  VkResult result = vkCreateInstance(&createInfo, NULL, &instance);

但请记住,一旦您的函数的作用域结束,该对象就会消失(在这种情况下为main)。

【讨论】:

  • 这基本上是正确的,但是 VkInstance 是 VkInstance_t* 的 typedef。所以在海报的代码中,我们有一个没有被初始化的 VkInstance_t**。在您的正确代码中,您获得了 VkInstance_t* 的地址,从而将有效地址传递给 vkCreateInstance。但是,由于返回了指向动态创建的实例的指针,它不会在函数退出时超出范围(VkInstance_t* 将)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 2020-12-31
  • 2019-07-21
  • 2018-07-28
  • 2014-04-25
  • 2011-07-18
  • 2013-02-26
相关资源
最近更新 更多