【发布时间】:2017-09-01 21:09:33
【问题描述】:
我目前正在使用 Ubuntu 上的 SDL 用 C++ 编写游戏。我最近对我的引擎进行了多线程处理,因此我从使用 valgrind/callgrind 进行分析切换到了 gperftools。我已经让它工作了,但它不会打印我自己的函数名称。奇怪的是,它可以识别 SDL 函数名称(我在网上的几个线程上看到了相反的情况;没有找到它们的名称的共享库函数)。
我运行我的程序,并执行以下两个命令来得到这个:
pprof --callgrind /bin/ls ls.prof > ls.callgrind
kcachegrind ls.callgrind
我知道有几种使用 gperftools 的方法;我通过包含“gperftools/profiler.h”并使用 ProfilerStart(“ls.prof”) 和 ProfilerStop() 函数来完成它。
作为参考,这是我的 Makefile 的一部分,以防万一:
OBJS = background.o gameObject.o uGrid.o main.o Timer.o sdlHandlers.o player.o handleEvents.o handleAllStateChanges.o enactAllStateChanges.o cleanLoop.o renderAll.o loadAllFiles.o loop.o inputHandler.o loopWrite.o loopDebug.o loopDebugSingleStep.o loopDebug_SDLDecoupled.o CC = g++ CFLAGS = -std=c++11 -Wall -O3 -c -g
Aegis: $(OBJS)
$(CC) $(OBJS) -I/sdlLib -lSDL2 -I/sdlLib -lSDL2_image -I/sdlLib -lSDL2_mixer -lX11 -pthread -lprofiler -o Aegis
我删除了对目标文件等的所有引用;这不是整个文件。根据要求,我可以发布整个 Makefile。
另外,由于人们过去感到困惑,我正在使用我项目文件夹中的 SDl2 库的副本。这不是错字。
如果有任何不清楚的地方,我很乐意回答或在需要时提供更多源代码。任何解决此问题的方法
谢谢!
【问题讨论】:
-
如果没有完整的 makefile 就无法确定(如果有完整的 'make' 输出,没有编译器警告(如果有的话),那就更好了)。 CC/CFLAGS 似乎很可疑,因为它旨在用于 C 代码,而不是 C++,但这取决于 makefile 的其余部分。而且您的非拼写错误路径仍然看起来不正确,因为它以
/(文件系统根目录)而不是./(当前目录)开头,但这与当前问题无关。
标签: sdl profiler gperftools