标签: memcheck

推荐的方法来跟踪C程序中数组越界访问/写入

考虑在C中编写一些不那么明显的算法的实现.例如,让我们在KN King的"C编程:现代方法,第2版"一书中找到它的递归快速排序,它可以从这里获得.最有趣的部分包括以下两个定义:

void quicksort(int a[], int low, int high)
{
    int middle;

    if (low >= high)
        return;

    middle = split(a, low, high);
    quicksort(a, low, middle - 1);
    quicksort(a, middle + 1, high);
}

int split(int a[], int low, int high)
{
    int part_element = a[low];

    for (;;) {
       while (low < high && part_element <= a[high])
           high--;
       if (low >= high)
           break;
       a[low++] = a[high];

       while (low < high && a[low] <= part_element)
           low++;
       if (low >= high) …
Run Code Online (Sandbox Code Playgroud)

c gdb splint memcheck cppcheck

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

如何使用valgrind查看c中函数的堆和堆栈使用情况?

我正在研究嵌入式系统.我们的嵌入式系统中的堆栈和堆数通常为64k(ram).我正在尝试使用polar-ssl库调用.有没有工具可以说明C函数使用了多少堆栈和堆内存?

在valgrind中是否有任何选项可以打印以下内容:

  1. 堆栈和堆的功能使用.
  2. 调用内部malloc调用的函数跟踪,没有字节.

c embedded valgrind arm memcheck

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

“读取调试信息时出现严重错误”-抑制?忽略?使固定?

我正在使用 valgrind 尝试查找 C-cum-C++ 程序中内存访问违规的原因。即使避免了这种访问(即当一切运行正常时),valgrind 告诉我:

==11436== Memcheck, a memory error detector
==11436== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==11436== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==11436== Command: bin/monetdb-bp-reader /home/eyalroz/dbfarms/monetdb/tpch-sf-1
==11436== 
--11436-- WARNING: Serious error when reading debug info
--11436-- When reading debug info from /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.24:
--11436-- Ignoring non-Dwarf2/3/4 block in .debug_info
--11436-- WARNING: Serious error when reading debug info
--11436-- When reading debug info from /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.24:
--11436-- Last block truncated …
Run Code Online (Sandbox Code Playgroud)

valgrind memcheck debug-information

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

在valgrind中可能失去什么意味着什么

我有很多可能从valgrind输入.那是什么意思 ?因为我正在使用sqlite并且它经过了很好的测试.我不认为这些是正确的条目.我做错了什么?

 16 bytes in 1 blocks are possibly lost in loss record 30 of 844
    ==23027==    at 0x4A05E1C: malloc (vg_replace_malloc.c:195)
    ==23027==    by 0x6525BE: sqlite3MemMalloc (in app_mem.out)
    ==23027==    by 0x63C579: mallocWithAlarm (in app_mem.out)
    ==23027==    by 0x63C904: sqlite3DbMallocRaw (in app_mem.out)
    ==23027==    by 0x6886D6: codeOneLoopStart (in app_mem.out)
    ==23027==    by 0x68A9C8: sqlite3WhereBegin (in app_mem.out)
    ==23027==    by 0x68CC9E: sqlite3Select (in app_mem.out)
    ==23027==    by 0x6A8644: yy_reduce (in app_mem.out)
    ==23027==    by 0x6AAEAC: sqlite3Parser (in app_mem.out)
    ==23027==    by 0x6AB357: sqlite3RunParser (in app_mem.out)
    ==23027==    by 0x6ADF84: sqlite3Prepare (in …
Run Code Online (Sandbox Code Playgroud)

valgrind memcheck

6
推荐指数
3
解决办法
1万
查看次数

转储valgrind数据

我在一个运行无限循环的程序上使用valgrind.

由于memcheck在程序结束后显示内存泄漏,但由于我的程序有无限循环,它将永远不会结束.

那么有什么方法可以强制性地从valgrind转储数据.

谢谢

valgrind memcheck

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

如何阻止Valgrind为每个新线程启动嵌入式gdb服务器?

我在一个程序上运行valgrind memcheck,该程序产生了数千个其他线程.

其他线程不会产生错误,我不关心它们会发生什么.

但是,每次新线程产生时,Valgrind都会坚持在/ tmp中打开命名管道.这不仅浪费,它实际上打破了valgrind.有时valgrind不会自行清理,然后具有相同pid的未来子代(稍后激活)无法生成,因为valgrind无法创建具有正确名称的管道(它已经存在).

如何防止Valgrind制作所有这些管道!?!

编辑:我已经尝试过的标志:

--child沉默-后叉=是

以及我已经排除的事情:

--track-children = no(默认值为no).

c++ multithreading valgrind memcheck

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

Valgrind抱怨std :: string构造函数中的字节丢失了

我是valgrind的新手,所以这可能会错过解释输出.Valgrind似乎认为字节在以下几行中丢失:

if ( mysqlpp::StoreQueryResult result = query.store() ){
   for ( size_t i = 0; i < result.num_rows(); ++i ){
       hash = std::string( result[i]["hash"].data(), result[i]["hash"].length() );
       label = std::string( result[i]["label"].data(), result[i]["label"].length() );
       keywords = std::string( result[i]["keywords"].data(), result[i]["keywords"].length() );
       task_raw = std::string( result[i]["task"].data(), result[i]["task"].length() );
       solution_raw = std::string( result[i]["solution"].data(), result[i]["solution"].length() );
Run Code Online (Sandbox Code Playgroud)

事实上,每当有一个std :: string以这种方式构建时,它就会抱怨^^.如果我正在复制的方式不正确,或者结果是以某种方式泄露,我无法弄清楚这是否是误报.

有趣的是,它抱怨另一段不使用mysql ++的代码,但同样使用了一个字符串构造函数:

for ( auto & f : frames ){
  for ( unsigned int i = 0; i < f.getTask().size(); i++ ){
     if ( i + 1 < …
Run Code Online (Sandbox Code Playgroud)

c++ valgrind stdstring memcheck c++11

6
推荐指数
0
解决办法
5888
查看次数

从 cuda-memcheck 的输出中跟踪函数名称

我正在运行cuda-memcheck调试我的代码,输出如下

========= Program hit cudaErrorCudartUnloading (error 29) due to "driver shutting down" on CUDA API call to cudaFree. 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 [0x2e40d3]
=========     Host Frame:./nmt [0x53526]
=========     Host Frame:./nmt [0xfbd9]
terminate called after throwing an instance of '=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 [0x3c259]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 [0x3c2a5]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xfc) [0x21ecc]
thrust::system::system_error'
=========     Host Frame:./nmt [0x530a]
=========
  what():  driver shutting down
========= Error: process didn't terminate …
Run Code Online (Sandbox Code Playgroud)

memory cuda gpu memcheck

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

cuda-memcheck,如何从地址获取源代码?

我成功使用了cuda-memcheck来获取有关错误内存访问的错误。用-g -G编译cuda代码可以得到很好的源位置,如下所示:

========= Error: process didn't terminate successfully
========= Invalid __global__ read of size 1
=========     at 0x00000710 in /some/path/somefile.cu:117:some_function
=========     by thread (0,14,0) in block (1,16,0)
=========     Address 0x00abac20 is out of bounds
Run Code Online (Sandbox Code Playgroud)

现在,我尝试使用-l开关来获取内存泄漏信息。但是,在这里,我只有地址:

========= CUDA-MEMCHECK
========= Leaked 3630 bytes at 0x007d2800
=========
========= Leaked 14740 bytes at 0x008e0700
...
=========
========= LEAK SUMMARY: 11122140 bytes leaked in 39 allocations
========= ERROR SUMMARY: 0 errors
400 bytes at 0x005d2000
Run Code Online (Sandbox Code Playgroud)

如何从中获得实际的代码位置?

c++ memory-leaks memory-management cuda memcheck

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

是否可以在iOS模拟器和设备上运行valgrind?

我需要在一个非常大的项目中调试堆溢出.在使用valgrind之后,它似乎是检测C中堆块溢出的完美工具,所以我想用它来运行我们的iOS应用程序.

我在OS X Yosemite上从trunk创建并安装了valgrind,并编写了一个有意堆溢出的测试程序,并验证了valgrind捕获并报告它们.

现在我想用它在模拟器中运行一个测试应用程序.我已经读过它可以通过使用execl()在iOS模拟器中运行,但是当我这样做时,我在控制台中看到以下错误.

dyld:缺少LC_DYLD_INFO加载命令

之后,应用程序将在带有EXC_BAD_ACCESS的dyldbootstrap :: rebaseDyld()中崩溃.这还有其他必要吗?Valgrind显然也支持arm64.是否可以使用我的应用程序打包valgrind可执行文件并在设备上运行它?

#define VALGRIND "/usr/local/bin/valgrind"

int main(int argc, char * argv[]) {

    if ( argc >= 2 && strcmp(argv[1], "-valgrind") == 0 ) {
        if ( execl(VALGRIND, VALGRIND, argv[0], NULL) < 0 ) {
            NSLog(@"Failed to relaunch under valgrind");
            exit(1);
        }
        NSLog(@"Running under valgrind!!");
    }

    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
Run Code Online (Sandbox Code Playgroud)

profiling valgrind memcheck ios ios-simulator

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