1

我目前正在使用 Ubuntu 上的 SDL 用 C++ 编写游戏。我最近对我的引擎进行了多线程处理,因此我从使用 valgrind/callgrind 进行分析切换到了 gperftools。我已经让它工作了,但它不会打印我自己的函数名称。奇怪的是,它可以识别 SDL 函数名称(我在网上的几个线程上看到了相反的情况;没有找到它们的名称的共享库函数)。

kcachegrind 输出

我运行我的程序,并执行以下两个命令来得到这个:

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 库的副本。那不是错字。

如果有任何不清楚的地方,我很乐意在需要时回答或提供更多源代码。任何解决此问题的方法

谢谢!

4

1 回答 1

0

您似乎正在链接您的程序而没有调试符号。在标志中添加 -g(或者我倾向于添加 -ggdb3)。

于 2017-09-17T00:07:18.500 回答