我正在使用调试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) 我开始学习 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 规范中的任何位置。
当我编译这个简单的测试程序时,我从地址清理器中得到了明显的泄漏报告,但是当我编译同一个程序但使用无限循环并中断它时,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
我在一个完整的程序中遇到了这个问题,但我把它简化为这个最小的例子。
我对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)