我目前正在用C++在Ubuntu上写一个游戏。我最近对引擎进行了多线程处理,所以我从使用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 .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库的副本。这不是打字错误。
如果有任何不清楚的地方,我很乐意回答或提供更多的源代码,如果需要。任何解决此问题的方法
谢谢!
发布于 2017-09-17 08:07:19
您似乎在没有调试符号的情况下链接程序。将-g (或者我倾向于添加-ggdb3)添加到标志。
https://stackoverflow.com/questions/46007988
复制相似问题