程序不会与valgrind一起运行

时间:2016-10-06 12:31:16

标签: c valgrind callgrind

我试图了解一个大型程序如何工作,我可以删除它的一部分来制作轻量级实用程序。该程序是一个使用X11和Motif以及OpenGL的交互式gui。

我能够在我的系统上成功构建和运行/调试程序;但是,每当我尝试使用valgrind运行程序时,程序永远不会运行(并且gui永远不会出现)。相反,当我尝试使用valgrind启动程序时,我得到valgrind头,然后最终

UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 16 times)

显示了很多次,然后valgrind就坐在那里。它甚至没有响应中断信号,我最终不得不使用kill -9来杀死它(有时甚至这不起作用,就像现在的情况一样)。

现在,我尝试使用valgrind的原因是我可以使用callgrind创建动态调用树,这样当我在gui中执行特定任务时,我可以看到发生了什么。

所以我有两个问题。 (1)为什么程序在bash,gdb,lldb等中运行正常,而不是valgrind? (2)我是否有另一种方法可以为我的程序创建动态调用映射(没有逐步调试调试器中的所有内容,因为这是一个庞大的项目,而且大多数函数都是gui相关的,我并不关心)?对于这两个问题,我在OSX 10.11.6上运行。另外,请注意我正在寻找动态调用映射,而不是静态调用映射,因为程序非常交织在一起,所以我只是迷失在像cscope这样的静态调用映射中。最后,我确实知道xcode中的乐器,但我的成功有限,但调用树并不是最容易理解的。

其他Valgrind信息

我正在使用

运行valgrind / callgrind
valgrind --tool=callgrind -- ./myprog myfile.test myconfig.test

其中myfile.test和myconfig.test是我的prog处理的文件。

此外,我正在使用brew install valgrind安装valgrind版本3.11.0。

如果我输入vgdb v.info scheduler运行valgrind实例,我会得到以下输出

sending command v.info scheduler to pid 22563

host stacktrace:
==22563==    at 0x238025363: ???
==22563==    by 0x238092515: ???
==22563==    by 0x238090986: ???
==22563==    by 0x238091785: ???
==22563==    by 0x238090C3B: ???
==22563==    by 0x23808C676: ???
==22563==    by 0x23808C9F1: ???
==22563==    by 0x238098AF3: ???
==22563==    by 0x238096F13: ???
==22563==    by 0x2380A88E4: ???
==22563==    by 0x2380A8B88: ???

sched status:
  running_tid=2

Thread 1: status = VgTs_WaitSys (lwpid 2567)
==22563==    at 0x10548CF72: mach_msg_trap (in /usr/lib/system/libsystem_kernel.dylib)
==22563==    by 0x10548C3B2: mach_msg (in /usr/lib/system/libsystem_kernel.dylib)
==22563==    by 0x10197DC52: get_session_port (in /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics)
==22563==    by 0x10197DB20: CGSServerPort (in /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics)
==22563==    by 0x10197F38C: CGSDisplaySystemStateCreateFromSerialization (in /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics)
==22563==    by 0x10197CC18: CGColorSpaceCreateWithState (in /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics)
==22563==    by 0x10197CA5A: color_space_create_icc (in /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics)
==22563==    by 0x10404140A: _dispatch_client_callout (in /usr/lib/system/libdispatch.dylib)
==22563==    by 0x104041302: dispatch_once_f (in /usr/lib/system/libdispatch.dylib)
==22563==    by 0x10197D12F: CGColorSpaceAdjustColor (in /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics)
==22563==    by 0x10197FDD1: lockDisplay (in /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics)
==22563==    by 0x100FF5211: xp_init (in /opt/X11/lib/libXplugin.1.dylib)
==22563==    by 0x10020DDA1: apple_glx_get_client_id (in /opt/X11/lib/libGL.1.dylib)
==22563==    by 0x10020DE45: apple_init_glx (in /opt/X11/lib/libGL.1.dylib)
==22563==    by 0x10020B307: applegl_create_display (in /opt/X11/lib/libGL.1.dylib)
==22563==    by 0x1001F349B: __glXInitialize (in /opt/X11/lib/libGL.1.dylib)
==22563==    by 0x1001F1391: GetGLXPrivScreenConfig (in /opt/X11/lib/libGL.1.dylib)
==22563==    by 0x1001F1A57: glXQueryExtensionsString (in /opt/X11/lib/libGL.1.dylib)
==22563==    by 0x100D708D4: getGLXextension (myExtensions.c:51)
==22563==    by 0x100D7025C: libQueryGLextensions (myExtensions.c:133)
==22563==    by 0x100D5CE64: libInit (mylib.c:37)
==22563==    by 0x1000016DF: main (myprog.c:81)
client stack range: [0x104163000 0x104962FFF] client SP: 0x104961888
valgrind stack top usage: 8744 of 1048576

Thread 2: status = VgTs_Runnable (lwpid 5635)
==22563==    at 0x105493EFA: kevent_qos (in /usr/lib/system/libsystem_kernel.dylib)
==22563==    by 0x104046DCC: _dispatch_mgr_thread (in /usr/lib/system/libdispatch.dylib)
client stack range: ???????
valgrind stack top usage: 12544 of 1048576

Thread 3: status = VgTs_Empty (lwpid 0)
client stack range: ???????
valgrind stack top usage: 5320 of 1048576

最后,当我调用valgrind时,它会启动X11(这是用于显示gui的内容)但gui永远不会弹出(并且它不仅仅隐藏在屏幕之外或其他桌面上)。根据上面的vgdb输出以及valgrind报告的mach错误来判断,看起来程序正在等待它从未得到的某种响应。

0 个答案:

没有答案