Valgrind抛出了这个错误:
==11204== Syscall param write(buf) points to uninitialised byte(s)
==11204== at 0x4109033: write (in /lib/libc-2.13.so)
==11204== by 0x8049654: main (mmboxman.c:289)
==11204== Address 0xbe92f861 is on thread 1's stack
==11204==
Run Code Online (Sandbox Code Playgroud)
有什么问题?我无法找到它正在大喊大叫的未初始化的字节.以下是犯罪行代码(提到的289行是调用函数lockUp的行):
Request request;
Response response;
fillRequest(&request, MANADDUSER, getpid(), argument1, NULL, NULL, 0, 0);
lockUp(&request, &response, NULL);
Run Code Online (Sandbox Code Playgroud)
这里函数原型和结构声明:
void fillRequest(Request *request, char code, pid_t pid, char *name1, char *name2, char *object, int id, size_t size)
{
int k;
request->code = code;
request->pid = getpid();
if(name1) for(k=0; k<strlen(name1)+1; k++) request->name1[k] = name1[k];
else …
Run Code Online (Sandbox Code Playgroud) 我想写一个CMakeLists.txt,以便我可以正常运行我的测试或使用valgrind.我已经看到很多关于将ctest与valgrind集成,但所有这些都假设您要设置服务器以将测试结果提交到飞镖仪表板.我只想在我的机器上运行测试并在命令行上查看结果.
如果我必须做一个cmake -D VALGRIND = ON就好了,但如果可能的话,我宁愿生成名为"foo"和"valgrind_foo"的测试.
我想要一些工具来诊断用户免费后的错误和未初始化的错误.我正在考虑Sanitizer(记忆和/或地址)和Valgrind.但我对它们的优点和缺点一无所知.谁能说出Sanitizer和Valgrind的主要特征,差异和优缺点?
编辑:我发现了一些比较:Valgrind使用DBI(动态二进制检测),Sanitizer使用CTI(编译时检测).无论Sanitizer的运行速度比Valgrind(2x)快得多,Valgrind都能让程序慢得多(20倍).如果有人能给我一些更重要的要点,那将是一个很大的帮助.
我在Mac OS X上使用代码块10.05
我下载了Valgrind,并提取了一个文件夹.我完全迷失了,并且不知道如何构建它.
我不知道任何终端/控制台命令,并且通常是编程新手,所以我不知道如何"构建"或"编译"它.我只有一个名为Valgrind的文件夹,里面有一堆随机文件.
有人可以告诉我怎么办?我已经检查了网站/文档,但它并没有真正给我安装说明,只是使用说明.
谢谢
PS:我知道我已经发布了这个问题,但之前的问题因为太模糊而被关闭了.我重新发布了这个更多信息.
PSS:我基本上要问的是,在从网站下载并提取文件后,我该如何安装Valgrind?
我一直在寻找上周试图找到这个问题的答案.
如何使用valgrind启动Android应用程序?我知道我可以使用'am'命令启动应用程序,但它会启动应用程序并退出.
我正在编写一个将NDK用于本机C代码的应用程序,我需要检查它是否存在可疑的内存错误.
编辑:
我学到了更多.您可以使用shell脚本"包装"应用程序.
这是我正在使用的shell脚本:
#!/system/bin/sh
VGPARAMS='--error-limit=no'
export TMPDIR=/data/data/com.starlon.froyvisuals
exec /data/local/Inst/bin/valgrind $VGPARAMS $*
Run Code Online (Sandbox Code Playgroud)
这是setprop:
adb shell setprop wrap.com.starlon.froyvisuals "logwrapper valgrind"
Run Code Online (Sandbox Code Playgroud)
以下是我启动应用的方式:
adb shell am start -n com.starlon.froyvisuals/.FroyVisuals
Run Code Online (Sandbox Code Playgroud)
我不认为这是对的,因为我不确定shell脚本适合哪里,我在logcat中没有看到任何东西.任何提示?
Edit2:哦shell脚本用上面的"setprop"命令表示.所以
adb shell setprop wrap.com.starlon.froyvisuals "logwrapper /data/local/val.sh"
Run Code Online (Sandbox Code Playgroud)
我还没有在logcat中看到任何东西.
我正在使用许多glib数据结构(GHashTable,GSList等)开发库.我一直在使用valgrind经常检查我的代码是否有内存泄漏.valgrind指出的大多数问题很容易解决,但有一些我无法弄清楚.
所有这些都被报道为"可能丢失".
在valgrind stacktrace的顶部,我总能找到相同的4个库:
==29997== 1,512 bytes in 3 blocks are possibly lost in loss record 24 of 25
==29997== at 0x4004B11: memalign (vg_replace_malloc.c:532)
==29997== by 0x4004B6B: posix_memalign (vg_replace_malloc.c:660)
==29997== by 0x5E9AC4: ??? (in /lib/libglib-2.0.so.0.1200.3)
==29997== by 0x5EA4FE: g_slice_alloc (in /lib/libglib-2.0.so.0.1200.3)
Run Code Online (Sandbox Code Playgroud)
在调用堆栈中,总是调用glib函数,例如g_key_file_new(),g_slist_prepend(),g_strsplit(),g_key_file_load_from_file(),g_file_get_contents().
我的问题是:
有没有人遇到这个并找到了解决方法?
或者这是我可以忽略的东西?是否由于glib使用内存池,如此处所示?
我在用
在我的工作中,我经常面对相当常见的编程错误 - 使用一些已经被释放的对象.这在C++中调用UB.在linux上,通常使用Valgrind工具Memcheck来解决这类问题.来自Memcheck手册:
Memcheck试图确定非法地址可能涉及的内容,因为这通常很有用.因此,如果它指向已经释放的内存块,您将被告知这一点,以及块被释放的位置.
Memcheck为我提供了调用堆栈,对象被解除分配,我可以继续调试问题.是否有类似的工具用于具有相同功能的Windows,最好是免费的?
我正在尝试在带有Snow Leopard的Mac上安装Valgrind但是我遇到了错误.这就是我在Terminal中输入的内容.
$ curl -O http://valgrind.org/downloads/valgrind-3.8.1.tar.bz2
$ md5sum valgrind-3.8.1.tar.bz2
$ tar -xjvf valgrind-3.8.1.tar.bz2
$ cd valgrind-3.8.1
$ ./configure
$ make
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误.
Making all in coregrind
make[2]: *** No rule to make target `/usr/include/mach/mach_vm.defs', needed by `m_mach/mach_vmUser.c'. Stop.
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)
我该如何更正此错误?
首先,我知道有类似的问题.但是,我希望有一个更普遍的简单问题,真正原始的C数据类型.所以这就是.
在 main.c
我调用一个函数来填充这些字符串:
int
main (int argc, char *argv[]){
char *host = NULL ;
char *database ;
char *collection_name;
char *filename = "";
char *fields = NULL;
char *query = NULL;
...
get_options(argc, argv, &host, &database, &collection_name, &filename,
&fields, &query, &aggregation);
Run Code Online (Sandbox Code Playgroud)
内部get_options
:
if (*filename == NULL ) {
*filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+4);
strcpy(*filename, *collection_name);
strcat(*filename, ".tde"); # line 69
}
Run Code Online (Sandbox Code Playgroud)
我的程序工作正常,但Valgrind告诉我,我做错了:
==8608== Memcheck, a memory error detector
==8608== Copyright (C) 2002-2011, and GNU GPL'd, by …
Run Code Online (Sandbox Code Playgroud) 我尝试在我的Mac上安装valgrind但是当我执行时./autogen.sh
得到这个错误:
running: aclocal
./autogen.sh: line 6: aclocal: command not found
error: while running 'aclocal'
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题?