2011-07-15 48 views
1

当我在linux下用gdb调试我的C++程序时?我使用-g进行编译,事实上,我在调试器中看到很多信息,但它一直告诉我,我的程序正常退出,并且没有显示任何错误。 虽然我只是运行我的程序,但它并没有完成,并表明并非一切都好(malloc.c中的一个断言失败)。什么可能是gdb运行我的程序,只是bash运行我的程序显示不同的输出?

我也有情况下,GDB,只是运行的程序表现出不同的错误消息。错误是alwazys与错误的指针,内存访问有关。

valgrind实际上一样。有没有可能使用valgrind不可能?特别是如果有不同的流程和共享库?如果我通过以下方法启用压缩错误:valgrind -v --trace-children = yes prog1(valgrind)--trace-children = yes prog1给我没有错误(我不能是真的) ,我得到了关于重定向冲突的警告(也不像是错误)。

回答

0

这可能是一个多线程问题和gdb减缓下来,以至于你的线程不冲突。也可能该程序正在运行优化? valgrind会说一切正常吗?

+0

不,程序未运行优化。这是什么意思? – yui

+0

如果使用-g -02或除了-g 00之外的任何其他编译程序,您正在运行优化,这将导致gdb开始动作怪异。 – Grammin

+0

用g ++ -g 02编译它确实不会改变gdb说程序正常退出的事实。 – yui

6

错误程序的问题是它们的行为是不确定的。他们有时会工作,并在其他时间不可预知地崩溃。

两个Valgrind的和GDB影响程序的时间,并有可能隐匿竞争条件(可发生两个多线程和多进程程序)。

此外,GDB禁用地址空间随机化,在程序运行,从运行重复做地址。这通常是您在调试时想要的,但是您的崩溃可能仅表现为共享库的特定随机布局,并且该布局在GDB下可能永远不会发生。

最好的选择是启用核心转储(ulimit -c unlimited)的生成,在GDB之外运行程序并使其中止(失败assert调用abort)。一旦你有一个核心,用GDB进行调试:gdb /path/to/your/executable core

对于你所描述的问题,Valgrind的通常是更好的工具。如果涉及多个进程,您需要使用--trace-children=yes标志运行valgrind。

+0

感谢您的回答。我试图让核心愚蠢,但我得到的消息,a.elf不存在。任何其他可能的核心愚蠢被拯救的可能性?对不起,但这是我第一次将所有这些(gdb,valgrind,core dumb,..) – yui

+0

核心转储通常称为“核心”,但有些系统称之为“核心”。 '。 'a.elf'只是一个例子,在那里用你崩溃的可执行文件的名称替代。编辑答案(希望)可以清楚地说明。 –

0

我将使在编译所有的警告与-Wall,这样GCC会警告你未初始化的变量,然后运行它里面的valgrind。其中一人应该告诉你这个问题。

+0

首先要做的是检查你传递给malloc的大小。一旦你打开-Wall,那么你减少了你在malloc中传递(未初始化)巨大值的机会。 – Ritesh

相关问题