考虑在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) 我正在研究嵌入式系统.我们的嵌入式系统中的堆栈和堆数通常为64k(ram).我正在尝试使用polar-ssl库调用.有没有工具可以说明C函数使用了多少堆栈和堆内存?
在valgrind中是否有任何选项可以打印以下内容:
我正在使用 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输入.那是什么意思 ?因为我正在使用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在程序结束后显示内存泄漏,但由于我的程序有无限循环,它将永远不会结束.
那么有什么方法可以强制性地从valgrind转储数据.
谢谢
我在一个程序上运行valgrind memcheck,该程序产生了数千个其他线程.
其他线程不会产生错误,我不关心它们会发生什么.
但是,每次新线程产生时,Valgrind都会坚持在/ tmp中打开命名管道.这不仅浪费,它实际上打破了valgrind.有时valgrind不会自行清理,然后具有相同pid的未来子代(稍后激活)无法生成,因为valgrind无法创建具有正确名称的管道(它已经存在).
如何防止Valgrind制作所有这些管道!?!
编辑:我已经尝试过的标志:
--child沉默-后叉=是
以及我已经排除的事情:
--track-children = no(默认值为no).
我是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) 我正在运行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) 我成功使用了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)
如何从中获得实际的代码位置?
我需要在一个非常大的项目中调试堆溢出.在使用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)