valgrind 相关问题

valgrind是适用于Linux,OS X,Android和Solaris系统的动态分析工具。它可用于分析以及查找内存泄漏,竞争条件和线程错误。

fortran 中的 Openmp“分段错误”[重复]

我的系统采用 Debian 12,配备 Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz。 我正在尝试使用 openmp 并行化一些 fortran 代码,它使用 FFTW 库并由多个模块组成...

回答 1 投票 0

gprofng 与 kcachegrind,体验更好

除了各自的营销宣传之外,我没有看到任何对 KcacheGrind 与 gprofng 进行比较的内容。有人有意见吗?当我使用 Valgr 时,我倾向于 kcachegrind...

回答 1 投票 0

程序运行,但 Valgrind 在尝试写入 malloc 内存时检测到问题

为了了解更多 C 语言,我正在尝试重新创建基本数据结构。这是我尝试数组的一个最小示例,该数组可以编译并运行,但 valgrind 检测到问题: #包括 为了了解更多 C 语言,我正在尝试重新创建基本数据结构。这是我尝试数组的一个最小示例,该数组可以编译并运行,但 valgrind 检测到问题: #include <stdlib.h> #include <stdio.h> typedef void * vp_t; typedef struct { int len; vp_t *start; } arr_t; arr_t * array_new(int len) { arr_t *arr = malloc(sizeof(arr_t)); arr->start = malloc(len * sizeof(vp_t)); arr->len = len; return arr; } void array_set(arr_t *arr, int i, vp_t vp) { vp_t *dest = arr->start + i * sizeof(vp_t); *dest = vp; } int array_get(arr_t *arr, int i) { int *p = *(arr->start + i * sizeof(vp_t)); return *p; } void array_delete(arr_t *arr) { free(arr->start); free(arr); } int main() { int x=0, y=1, z=2; arr_t *arr = array_new(3); array_set(arr, 0, &x); array_set(arr, 1, &y); array_set(arr, 2, &z); for (int i = 0; i < 3; ++i) printf("%i ", array_get(arr, i)); putchar('\n'); array_delete(arr); return 0; } 程序按预期输出 1 2 3。然而,当我第二次和第三次调用 array_set 函数时,valgrind 检测到了一个问题。针对此处的示例代码运行 valgrind,我得到: ==91933== Invalid write of size 8 ==91933== at 0x109244: array_set (min.c:22) ==91933== by 0x109312: main (min.c:39) ==91933== Address 0x4a990d0 is 32 bytes before an unallocated block of size 4,194,032 in arena "client" ==91933== ==91933== ==91933== Process terminating with default action of signal 11 (SIGSEGV) ==91933== Access not within mapped region at address 0x2003A98F4C ==91933== at 0x109244: array_set (min.c:22) ==91933== by 0x109327: main (min.c:40) min.c:22指的是array_set函数中的*dest = vp。 min.c:39指的是array_set(arr, 1, &y)。 Valgrind 不抱怨第 38 行,array_set(arr, 0, &x)。 我一直在研究gdb,但我还没弄清楚。感谢您的浏览。 当您需要寻址数组时,只需将多少个单元格(除了单元格大小)添加到指针即可。 void array_set(arr_t *arr, int i, vp_t vp) { vp_t *dest = arr->start + i; *dest = vp; } int array_get(arr_t *arr, int i) { int *p = *(arr->start + i); return *p; } arr->start 的类型为 vp_t,因此当您向指针添加 1 时,编译器将增加所需的数量 (sizeof(vp_t)) 以转到下一个单元格。 这就是解决方案,但首先为什么,你需要一个 void ** 数组,如果你想创建一个整数数组,请使用 int** 创建,只有当你需要任何类型的数组时才推荐使用 void 数组。 不管怎样,错误在于你创建了一个 void* (一维),而实际上,应该是一个二维数组 void ** #include <stdlib.h> #include <stdio.h> typedef struct { int len; void **start; } arr_t; arr_t * array_new(int len) { arr_t *arr = malloc(sizeof(arr_t)); arr->start = malloc(len * sizeof(void*)); arr->len = len; return arr; } void array_set(arr_t *arr, int i, void *vp) { arr->start[i] = vp; } int array_get(arr_t *arr, int i) { return *(int*)arr->start[i]; } void array_delete(arr_t *arr) { free(arr->start); free(arr); } int main() { int x=0, y=1, z=2; arr_t *arr = array_new(3); array_set(arr, 0, &x); array_set(arr, 1, &y); array_set(arr, 2, &z); for (int i = 0; i < 3; ++i) printf("%i ", array_get(arr, i)); putchar('\n'); array_delete(arr); return 0; }

回答 2 投票 0

从 cmake 传递 valgrind 标志

作为这个问题的补充,我如何从 cmake 将标志传递给 valgrind? # 启用 valgrind 检查 设置(CTEST_MEMORYCHECK_TYPE“valgrind”) 设置(CTEST_MEMORYCHECK_COMMAND_OPTIONS“-...

回答 1 投票 0

如何跟踪对内存块的所有访问?

我希望记录对堆中分配的块中由给定指针指向的地址的所有访问。在下面的示例中,它将监视对 p.1024 字节的所有访问。 #定义黑色

回答 1 投票 0

带有内存内容的内存跟踪

我正在尝试获取一个简单程序运行的内存跟踪,我可以在其中看到正在读/写的地址和数据,例如W 0x7fffffffd928 4 0xe4d829d0 代表写入 4 字节

回答 1 投票 0

cs50 恢复仍然可达,但没有 valgrind 错误

我已经在“恢复”程序中挣扎了几个小时,但似乎找不到问题。 我以为我已经关闭了所有文件,而且我还没有使用“malloc”语法来存储内存

回答 1 投票 0

ld 从源代码构建 Valgrind 时找不到 -lmpi

我正在尝试从源代码构建 Valgrind 3.21.0,我在此处下载了存档并按照自述文件中的说明进行操作: 运行./configure 运行“制作” 运行“make install”,可能...

回答 1 投票 0

C 中的内存释放

我分配了一个二维指针数组。我需要使用数组符号(例如索引或偏移值)来释放该指针数组。 int main(int argc, char *argv[]) { int** A、B、C;...

回答 1 投票 0

如何修复 valgrind“条件跳转或移动取决于未初始化的值”错误?

我有这个简单的程序: #包括 #包括 #包括 int 主函数(无效){ 字符*str; 字符串=空; str = malloc(sizeof(char) * 20); 圣...

回答 1 投票 0

由于 opensll 导致手臂上出现 valgrind SIGILL

我正在尝试使用 Valgrind 分析在arm上运行的应用程序。我在里面使用 ssl 和 libcrypto 。因此,在尝试分析它时,我收到了 SIGILL。 我尝试禁用它 --...

回答 2 投票 0

Valgrind 报告共享对象内存泄漏

我有一个C程序,可以使用libmpg123和libao播放mp3文件。我使用 Valgrind 通过以下命令检测内存泄漏和其他潜在问题: valgrind --leak-check=full --show-leak-...

回答 3 投票 0

内存泄漏!我该如何解决它?

好的,所以我只是在学习内存泄漏。我运行 Valgrind 来查找内存泄漏。我得到以下信息: ==6134== 3个块中的24个字节肯定在丢失记录4 of 4中丢失 ==6134== 在 0x40263...

回答 3 投票 0

内存泄漏!怎么解决?

好的,所以我只是在学习内存泄漏。我运行 Valgrind 来查找内存泄漏。我得到以下信息: ==6134== 3个块中的24个字节肯定在丢失记录4 of 4中丢失 ==6134== 在 0x40263...

回答 3 投票 0

Valgrind:为什么我会在使用 memcpy 时出现分段错误错误

我有一个带有 fftw 函数的简单代码,有时工作正常,有时返回分段错误,所以我用代码运行 Valgrind,这就是我得到的: 静态常量 int nx = 128; 静态...

回答 2 投票 0

我如何处理这个 C 90 代码中的内存泄漏?

代码大致是这样的: 输入给出一个矩阵及其列和行的值,算法会搜索最短路径,并优先选择某些单元格继续前进。 这是...

回答 1 投票 0

复制dom然后替换节点(xmlCopyDoc和xmlReplaceNode)时内存泄漏

我正在构建一个程序,使用 libxml2 v2.11 在两个 xml 文件之间进行合并验证。 总之,我正在创建目标 dom 的副本,然后用替换 dom 的节点替换所有节点...

回答 1 投票 0

MPI_Bcast 在大型字符数组上返回退出代码:139

如果您能帮助我解决以下情况,我将不胜感激。 我通过连续两个步骤广播(在本地主机上)一个字符数组: MPI_Bcast 数组的大小 MPI_Bcast 数组...

回答 1 投票 0

char* 上的 free() 被 valgrind 识别为无效

我正在尝试释放 char** 数组中存在的 char* 指针,但 valgrind 确定此操作无效。 这是我正在做的一个简单示例: 结构建筑{ 整数

回答 1 投票 0

Valgrind 使用 Zig 进行非法硬件指令

我正在尝试使用 Valgrind 调试内存以获取泄漏内存的简单 Zig 代码。 这是我正在使用的代码 const std = @import("std"); const 点 = 结构 { x:i32, y: i3...

回答 0 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.