Debugging 使valgrind在第一次出错后立即停止

Debugging 使valgrind在第一次出错后立即停止,debugging,valgrind,Debugging,Valgrind,我的程序处理大量错误,并且在开发过程中在控制台上生成大量输出。它遭受内存损坏,我尝试使用valgrind来定位错误 不幸的是,我在输出行中找不到错误消息,它们的刷新速度太快,无法在弹出时取消执行。它们必须在那里才能定位错误(哪个元素导致错误等等)。然后在我的程序中重定向不起作用,就像管道输出只重定向程序输出,而不是valgrind输出一样 你能告诉我如何解决这个问题吗。默认情况下,Valgrind输出到stderr(fd2)。您可以通过重定向文件2来捕获stderr: # Output to l

我的程序处理大量错误,并且在开发过程中在控制台上生成大量输出。它遭受内存损坏,我尝试使用valgrind来定位错误

不幸的是,我在输出行中找不到错误消息,它们的刷新速度太快,无法在弹出时取消执行。它们必须在那里才能定位错误(哪个元素导致错误等等)。然后在我的程序中重定向不起作用,就像管道输出只重定向程序输出,而不是valgrind输出一样


你能告诉我如何解决这个问题吗。

默认情况下,Valgrind输出到stderr(fd2)。您可以通过重定向文件2来捕获stderr:

# Output to log file.
valgrind [options] > valgrind.log 2>&1

# View output interactively.
valgrind [options] 2>&1 | less
或者您可以使用
--log fd
选项更改输出的发送位置:

valgrind [options] --log-fd=1 > valgrind.log
valgrind [options] --log-fd=1 | less

您可以要求
valgrind
将其输出保存到文件中:

valgrind --log-file=<filename>
valgrind——日志文件=

其中,
是输出的文件名。稍后,您可以使用
less
或文本编辑器查看此文件。

除了将程序和Valgrind输出重定向到文件(如前所述),还可以使用
--db attach=yes
标志,这将导致程序在出现错误时立即停止在调试器中


这样做的好处是,除了查看程序生成的日志外,您还可以查看其他程序状态(未记录)。

如果您希望它在控制台中停止(而不是在文件中),以下是一种方法:

使用参数:
--gen suppressions=yes

调试时,它将按如下方式停止:

==949== Thread 2:
==949== Invalid read of size 4
==949==    at 0x7B62DC0: wcslen (wcslen.S:24)
==949==    by 0x7B62D7D: wcsdup (wcsdup.c:29)
==949==    by 0x52D0476: de_strdup(wchar_t*) (de_string.cpp:1442)
==949==    by 0x437629: void de_format<>(c_de_string&, wchar_t*) (de_string.h:368)
==949==    by 0x45F4FB: int db_select_group<>(s_db*, s_pqexec_param*, wchar_t*, wchar_t*, wchar_t*, wchar_t*, int, wchar_t*) (in /corto/goinfre/code2/cortod.repo/bin/x64/Debug/cortod)
==949==    by 0x45EA96: check_oldgeom(c_cartod*) (cartod_funcs.cpp:114)
==949==    by 0x45EBF8: armserv_update_geom(c_cartod*) (cartod_funcs.cpp:149)
==949==    by 0x455EF9: c_cortosrv_thread::on_timeout() (cartod.cpp:163)
==949==    by 0x52FE500: c_de_thread::loop() (de_thread.cpp:35)
==949==    by 0x52FEE97: thread_loop(void*) (de_thread_priv_linux.cpp:85)
==949==    by 0x506E181: start_thread (pthread_create.c:312)
==949==    by 0x7BBA47C: clone (clone.S:111)
==949==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==949== 
==949== 
==949== ---- Print suppression ? --- [Return/N/n/Y/y/C/c] ---- 
==949==线程2:
==949==大小为4的读取无效
==949==0x7B62DC0:wcslen(wcslen.S:24)
==949==0x7B62D7D:wcsdup(wcsdup.c:29)
==949==by 0x52D0476:de_strdup(wchar_t*)(de_string.cpp:1442)
==949==by 0x437629:void de_格式(c_de_字符串&,wchar_t*)(de_字符串.h:368)
==949==0x45F4FB:int-db_-select_组(s_-db*、s_-pqexec_-param*、wchar_-t*、wchar_-t*、wchar_-t*、int、wchar_-t*)(in/corto/goinfre/code2/cortod.repo/bin/x64/Debug/cortod)
==949==0x45EA96:检查旧几何体(c_cartod*)(cartod_funcs.cpp:114)
==949==0x45EBF8:armserv\u update\u geom(c\u cartod*)(cartod\u funcs.cpp:149)
==949==0x455EF9:c_cortosrv_thread::on_timeout()(cartd.cpp:163)
==949==by 0x52FE500:c_de_thread::loop()(de_thread.cpp:35)
==949==by0x52fee97:thread\u循环(void*)(deu thread\u priv\u linux.cpp:85)
==949==by 0x506E181:start\u thread(pthread\u create.c:312)
==949==by 0x7BBA47C:clone(clone.S:111)
==949==地址0x0不是堆栈、malloc或(最近)空闲
==949== 
==949== 
==949==----打印抑制?--[退货/否/是/是/成本/成本]--
然后你可以去下一个继续等等


此参数的正常用途是通过打印可添加到文件中并使用参数将其传递给valgrind的抑制来消除误报:
--suppressions=
valgrind 3.14.0具有以下选项:

ERROR-RELATED OPTIONS         top

       These options are used by all tools that can report errors, e.g.
       Memcheck, but not Cachegrind.

   ...

   --exit-on-first-error=<yes|no> [default: no]
       If this option is enabled, Valgrind exits on the first error. A
       nonzero exit value must be defined using --error-exitcode option.
       Useful if you are running regression tests or have some other
       automated test machinery.
错误相关选项顶部
所有可以报告错误的工具都使用这些选项,例如。
Memcheck,但不是Cachegrind。
...
--第一个错误时退出=[默认值:否]
如果启用此选项,Valgrind将在第一个错误时退出。A.
必须使用--error exitcode选项定义非零退出值。
如果您正在运行回归测试或有其他一些
自动测试机器。

这个“断开”VG输出与程序输出的连接,OP声称这是了解程序在VG出错时正在处理的数据所必需的。超级有用的标志——在我使用gdb的几年中从未知道过这一点。谢谢我看到他们在最新的valgrind中删除了这个选项。它非常有用,如果没有它,我很难调试,你知道另一种方法吗?是的,使用
--vgdb error=0
,然后按照说明操作。实际上,-vgdb error=1更接近。(=0将允许您在出现错误时停止,=1之前设置断点)谢谢。这就是我所寻找的:)选项不存在于valgrind 1:3.13.0-2.1 amd64关于debian测试供将来参考:支持此功能的第一个版本是3.14,据我所知,我很沮丧--exit on first error=yes被valgrind拒绝,但事实证明您还必须添加“-error exitcode=1”,至少在debian上使用valgrind 3.15.0。编译最新的valgrind并不难。