我按如下方式运行valgrind: -
/ usr/local/bin/valgrind"process_name"
在执行之后它给我跟随错误
==21731==
==21731== Warning: Can't execute setuid/setgid executable:
==21731== Possible workaround: remove --trace-children=yes, if in effect
==21731==
valgrind: "process name": Permission denied
Run Code Online (Sandbox Code Playgroud)
我的valgrind权限如下: - -r-sr-xr-x/usr/local/bin/valgrind
我的进程权限如下: - -r-sr-xr-x"process_name"
平台:Linux VMLINUX3 2.6.9-78.0.22.ELsmp(RHEL)
Valgrind版本:valgrind-3.5.0
任何有关这方面的帮助将不胜感激
Valgrind在为字符串赋值时报告内存泄漏.
我使用以下简单代码来测试Valgrind报告的内存泄漏.
/******************************************
* FILE: t3.c
* Compiled using : g++ -g t3.c -o t3
*
* $ g++ -v
* Reading specs from /usr/lib/gcc/i686-pc-linux-gnu/3.4.6/specs
* Configured with: ./configure --prefix=/usr --infodir=/share/info --mandir=/share/man
* --enable-languages=c,c++ --with-system-zlib --program-suffix=-3.4 --enable-threads=posix
* Thread model: posix
* gcc version 3.4.6
******************************************/
#include <iostream>
#include <string>
using namespace std;
/**************************************************************
**************************************************************/
int main(int argc, char *argv[])
{
string test = "XXXXXXXXX";
cout << "this is a test " << test << endl;
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
我使用这个命令编译:
$ …Run Code Online (Sandbox Code Playgroud) 我尝试使用valgrind来描述一个简单的c prog:
[zsun @ nel6005001~] $ valgrind --tool = memcheck ./fl.out
== 2238 == Memcheck,内存错误检测器
== 2238 == Copyright(C)2002-2009,GNU GPL'd,Julian西沃德等人.
== 2238 ==使用Valgrind-3.5.0和LibVEX; 重新运行-h版权信息
== 2238 ==命令:./ fl.out
== 2238 ==
== 2238 ==
== 2238 == HEAP SUMMARY:
== 2238 ==在退出时使用:1,168字节in 1个块
== 2238 ==总堆使用量:1个allocs,0个frees,1,168个字节分配
== 2238 ==
== 2238 == LEAK SUMMARY:
== 2238 ==绝对丢失:0个块中的0个字节
== 2238 = =间接丢失:0个块中的0个字节
== 2238 ==可能丢失:0个块中的0个字节
== 2238 ==仍然可达:1个块中的1,168个字节
== 2238 ==抑制:0个块中的0个字节
== 2238 ==重新运行--leak-check = full以查看泄漏内存的详细信息
== 2238 ==
== 2238 …
在用Valgrind调试我的程序时,我发现了一个内存泄漏,尽管我认为是有效的免费调用.首先,分配内存并存储它的代码:
row = malloc(sizeof(Row));
row->columns = malloc(sizeof(char*) * headcnt);
row->numcol = 0;
...
row->numcol = colcnt;
rows = realloc(rows, (rowcnt+1) * sizeof(Row));
rows[rowcnt++] = *row;
Run Code Online (Sandbox Code Playgroud)
负责尝试释放内存的代码:
void cleanUp(){
int i = 0;
int j = 0;
for (i = 0; i < rowcnt; i++){
for (j = 0; j < rows[i].numcols; j++){
free(rows[i].columns[j]);
}
free(&rows[i]);
}
free(rows);
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
Row的声明:
typedef struct {
char** columns;
unsigned short int numcol;
} Row;
Row* rows = NULL;
Run Code Online (Sandbox Code Playgroud)
更糟糕的是,这个程序有时会导致glibc错误,free(&rows[i])因为抱怨双重免费.我是C的新手,并且会感谢有人可能提出的任何指针(咳咳).
我有一个程序在一个单独的therad中运行一些动作,然后加入线程,比如这个:
#include <boost/thread.hpp>
#include <iostream>
using namespace std;
void f() {
for (int i = 0; i < 100; ++i) cout << i << endl;
}
int main() {
boost::thread t(f);
t.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我在其上运行Valgrind,它会报告"可能丢失"的内存.如果省略join(),这似乎是合乎逻辑的,因为在这种情况下,当程序退出时线程仍在运行.但如果线程完成,我希望没有警告.
这是回溯:
==8797== 288 bytes in 1 blocks are possibly lost in loss record 2 of 3
==8797== at 0x4A1F8B3: calloc (vg_replace_malloc.c:467)
==8797== by 0x400F289: allocate_dtv (in /lib64/ld-2.4.so)
==8797== by 0x400F34D: _dl_allocate_tls (in /lib64/ld-2.4.so)
==8797== by 0x53EF981: pthread_create@@GLIBC_2.2.5 (in /lib64/libpthread-2.4.so)
==8797== by 0x4B3311D: …Run Code Online (Sandbox Code Playgroud) 我想用几乎自动化的工具检查我的程序内存(我还不是很好的gdb),所以我最后使用了valgrind.
但是,我想把一个烟斗作为valgrind的输入; 即我想提出以下内容:
>cat file.h | ./prog
Run Code Online (Sandbox Code Playgroud)
我试着做一个
>valgrind `cat file.h | ./prog`
Run Code Online (Sandbox Code Playgroud)
没有成功.
我还尝试制作一个脚本文件,然后将整个命令放入其中,然后将其传递给valgrind,但没有成功.
#include <stdio.h>
main()
{
char buf[8];
sprintf(buf,"AAAA%3s","XXssssssssXXXsssssXXX");
printf("%s\n",buf);
}
Run Code Online (Sandbox Code Playgroud)
我希望valgrind能够使用上面的代码检测缓冲区溢出.但它不会报告任何错误或警告.我需要为此启用任何特殊标志吗?
我是Linux新手(昨天安装的新版本),我在大学的编程课程中需要它,我被告知要安装特定程序的特定版本,但是我已经使用了apt-get install来安装他们(以前做过apt-get更新)他们的版本不正确.
我需要的程序是make 4.0和valgrind 3.10.1.
apt-get installs make 3.81和valgrind 3.10.0.SVN.
我尝试输入"apt-get install make4.0"和"apt-get install valgrind10.3.1"无济于事.我已经从互联网上下载了它们,并按照我可以理解的说明安装新版本,但它一直说我有旧的版本.(我不确定我是否可以在这里发布直接链接,如果我可以告诉我,我会发布我从哪里发布).
我做错了什么?我怎样才能解决这个问题?
我目前正在运行Linux Mint.
谢谢你提前回答.
我想描述一下我的代码.所以我这样做:
valgrind --tool=callgrind my_program [programm arguments]
kcachegrind callgrind.out.x
Run Code Online (Sandbox Code Playgroud)
现在我有这样的kcachegrind窗口:
有很多核心和库函数,但是我如何设置valgrind或kcachegrind仅跟踪函数在我的代码中(当然,它还有调用库函数)?
预期的输出是这样的:
time number of calls function_name()
4,52% 569854 CSim2Sim my_function1(int argc, char* argv[])
3,52% 452158 CSim2Sim my_function2(int argc, char* argv[])
3,52% 36569 CSim2Sim my_function3(int argc, char* argv[])
1,52% 1258 CSim2Sim my_function4(int argc, char* argv[])
Run Code Online (Sandbox Code Playgroud) valgrind ×10
c++ ×3
linux ×3
c ×2
g++ ×2
memory ×2
memory-leaks ×2
boost-thread ×1
callgrind ×1
kcachegrind ×1
linux-mint ×1
makefile ×1
pointers ×1
setuid ×1
string ×1
updates ×1