小编Bun*_*gow的帖子

如何调试使用调试信息编译的共享库

我正在使用调试simbols编译一个程序,该程序链接到也使用调试符号编译的共享库(liballegro).当我尝试进入这个共享库的一个函数时,我看不到任何代码.

file myBin 
mybin: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=d4133ef127e81ffb007c4c17e10f4ddaefac6a0f, with debug_info, not stripped

file lib/liballegro-debug.so
liballegro-debug.so.5.2.2: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=dd75ca87e0ed86832ed02a1c40548a055ad4f551, with debug_info, not stripped
Run Code Online (Sandbox Code Playgroud)

GDB显示了如何使用调试信息加载此lib:

(gdb) info shared
From                To                  Syms Read   Shared Object Library
0x00007ffff7dd9b40  0x00007ffff7df5110  Yes (*)     /lib64/ld-linux-x86-64.so.2
0x00007ffff7a5a0d0  0x00007ffff7b84591  Yes         correct/path/to/liballegro-debug.so
0x00007ffff76ffd60  0x00007ffff7778eef  Yes (*)     /usr/lib/libm.so.6
0x00007ffff74e1640  0x00007ffff74eefb1  Yes (*)     /usr/lib/libpthread.so.0
[...]
Run Code Online (Sandbox Code Playgroud)

所以我在一个函数调用中放了一个断点,它位于共享库中(al_load_bitmap):

90      level->tileset.parent = al_load_bitmap(filename); …
Run Code Online (Sandbox Code Playgroud)

c debugging gdb allegro5 lldb

5
推荐指数
1
解决办法
793
查看次数

我什么时候可以释放传递给 vulkan vkCreateXXX 函数的资源和结构?

我开始学习 Vulkan,想知道 VkCreate[...] 函数是否将结构中指向的资源复制到他自己的缓冲区中。

为了澄清我的问题,在这段代码中,我将一个SPIR着色器加载到我自己的 mkShader 结构中,然后我使用vkCreateShaderModule.

static VkShaderModule mkVulkanCreateShaderModule(MkVulkanContext *vc,
                     const char *filename)
{
    VkShaderModule shaderModule;
    struct mkShader *shader = mkVulkanLoadShaderBinary(filename);
    VkShaderModuleCreateInfo createInfo = {0};
    createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
    createInfo.codeSize = shader->size;
    createInfo.pCode = (uint32_t *)shader->buffer;

    if (vkCreateShaderModule(vc->device, &createInfo, NULL,
                 &shaderModule) != VK_SUCCESS) {
        printf(ANSI_COLOR_RED
               "Failed to create shader module\n" ANSI_COLOR_RESET);
        assert(0);
        exit(EXIT_FAILURE);
    }
    mkVulkanFreeShaderBinary(shader);
    return shaderModule;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我在mkVulkanFreeShaderBinary创建着色器模块之后释放了 mkShader 结构,并且我没有从我的程序中收到任何错误。所以我的问题是这样做是否安全,或者我必须保留 mkShader 结构,直到我销毁着色器模块。而且,这是否对所有 VkCreate[...] 函数都有效,并且此信息是否在 Vulkan 规范中的任何位置。

vulkan

5
推荐指数
1
解决办法
374
查看次数

发出 SIGINT 以停止循环时如何获取地址清理器的输出

当我编译这个简单的测试程序时,我从地址清理器中得到了明显的泄漏报告,但是当我编译同一个程序但使用无限循环并中断它时,SIGINT我没有得到任何输出。

检查 asm 输出,malloc未优化(如果可能的话)

这是地址消毒剂的预期行为吗?我在其他开发中没有遇到这个问题。

工作示例:

#include <stdlib.h>
int main(void)
{
    char *a = malloc(1024);
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

不工作(用 SIGINT 杀死):

#include <stdlib.h>
int main(void)
{
    char *a = malloc(1024);
    for(;;);
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

编译: gcc test.c -o test -fsanitize=address

我在一个完整的程序中遇到了这个问题,但我把它简化为这个最小的例子。

c address-sanitizer

3
推荐指数
2
解决办法
1392
查看次数

更改全局范围对象

我对python中的全局范围有疑问.

我制作这个剧本并且有效,但我不知道为什么:

#! /bin/python3
# -*- coding: UTF-8 -*-

data = []
stats = {'white':0, }

def main():
    global data

    with open(args.finput, 'r') as f:
        data = f.readlines()

    rwhitespaces()

    with open(foutput, 'w') as f:
        for line in data:
            f.write(line)

    print(stats)

def rwhitespaces():
    cnt = 0
    for line in data:
        if line == '\n':
            data.pop(cnt) # Modifing data var without global keywork and works, why??
            stats['fistro'] = 1 # Modifing stats var without global keywork and works why??
        cnt += 1 …
Run Code Online (Sandbox Code Playgroud)

python global-variables python-3.x

1
推荐指数
1
解决办法
73
查看次数