GDB - 未找到调试符号 -

Posted

技术标签:

【中文标题】GDB - 未找到调试符号 -【英文标题】:GDB - No Debugging Symbols Found - 【发布时间】:2016-09-18 17:29:30 【问题描述】:

所以我托管了一个 8.6 的 OpenTibia-Server。有时服务器冻结,我不知道是什么原因导致它冻结,所以我请我的朋友帮助我,他告诉我用 gdb 选项编译控制台。我做到了。但是当我在控制台冻结后将它附加到 GDB 时,它说没有找到调试符号。我也添加了选项 -g-s(第 6 行),但它不起作用。

这是我的 Makefile.am:

noinst_PROGRAMS = theforgottenserver

CXXFLAGS = -pipe -std=gnu++11
AM_CXXFLAGS = $(XML_CPPFLAGS) $(OTSERV_FLAGS) $(LUA_CFLAGS) $(DEBUG_FLAGS)\
$(mysql_FLAGS) $(SQLITE_FLAGS) $(PGSQL_FLAGS) $(PROFILER_FLAGS)\
$(OPTIONAL_FLAGS) -D_THREAD_SAFE -D_REENTRANT -Wall -Wextra -Wno-strict-aliasing -llua5.1 -I/usr/include/lua5.1 -g -s

theforgottenserver_LDADD = $(LUA_LIBS)

if USE_MYSQL
MAYBE_MYSQL = databasemysql.cpp databasemysql.h
endif
if USE_SQLITE
MAYBE_SQLITE = databasesqlite.cpp databasesqlite.h
endif
if USE_PGSQL
MAYBE_PGSQL = databasepgsql.cpp databasepgsql.h
endif
if LOGIN_SERVER
MAYBE_LOGIN = gameservers.cpp gameservers.h
endif
if OT_ADMIN
MAYBE_OTADMIN = admin.cpp admin.h
endif

theforgottenserver_SOURCES = account.h actions.cpp actions.h $(MAYBE_OTADMIN) \
        allocator.cpp allocator.h baseevents.cpp baseevents.h beds.cpp \
        beds.h chat.cpp chat.h combat.cpp combat.h condition.cpp condition.h \
        config.h configmanager.cpp configmanager.h connection.cpp connection.h \
        const.h container.cpp container.h creature.cpp creature.h \
        creatureevent.cpp creatureevent.h cylinder.cpp cylinder.h database.cpp \
        database.h databasemanager.cpp databasemanager.h $(MAYBE_MYSQL) \
        $(MAYBE_SQLITE) $(MAYBE_PGSQL) depot.cpp depot.h dispatcher.cpp \
        dispatcher.h exception.cpp exception.h fileloader.cpp fileloader.h \
        game.cpp game.h $(MAYBE_LOGIN) globalevent.cpp globalevent.h group.cpp \
        group.h house.cpp house.h housetile.cpp housetile.h ioban.cpp ioban.h \
        ioguild.cpp ioguild.h iologindata.cpp iologindata.h iomap.cpp iomap.h \
        iomapserialize.cpp iomapserialize.h item.cpp item.h itemattributes.cpp \
        itemattributes.h items.cpp items.h luascript.cpp luascript.h \
        mailbox.cpp mailbox.h manager.cpp manager.h map.cpp map.h monster.cpp \
        monster.h monsters.cpp monsters.h movement.cpp movement.h \
        networkmessage.cpp networkmessage.h npc.cpp npc.h otpch.h otserv.cpp \
        otsystem.h outfit.cpp outfit.h outputmessage.cpp outputmessage.h \
        party.cpp party.h player.cpp player.h position.cpp position.h \
        protocol.cpp protocol.h protocolgame.cpp protocolgame.h \
        protocolhttp.cpp protocolhttp.h protocollogin.cpp protocollogin.h \
        protocolold.cpp protocolold.h quests.cpp quests.h raids.cpp raids.h \
        rsa.cpp rsa.h scheduler.cpp scheduler.h scriptmanager.cpp \
        scriptmanager.h server.cpp server.h spawn.cpp spawn.h spells.cpp \
        spells.h status.cpp status.h talkaction.cpp talkaction.h teleport.cpp \
        teleport.h templates.h textlogger.cpp textlogger.h thing.cpp thing.h \
        tile.cpp tile.h tools.cpp tools.h town.h trashholder.cpp trashholder.h \
        waitlist.cpp waitlist.h waypoints.h weapons.cpp weapons.h vocation.cpp \
        vocation.h

当我附加GDB 并运行bt 时,这是我在终端上得到的

【问题讨论】:

您的屏幕转储显示您将 gdb 附加到“屏幕”进程,而不是您的程序。您将其附加到错误的进程。 我该怎么办? 将 gdb 附加到正确的进程。 清理构建,然后再次构建,查看编译命令的输出,看看是否使用了您期望的标志。 【参考方案1】:

我添加了选项 -g 和 -s

-g 选项告诉编译器发出调试信息。

-s 选项告诉链接器删除(剥离)调试信息。你想要那个选项。

您还需要附加到正确的进程(不是您附加到的screen)。附加正确的进程后,您需要发出(gdb) thread apply all where 命令,该命令的complete 输出可能允许熟悉 OpenTibia 的人诊断死锁。

注意:您实际上并不需要调试版本的 OpenTibia Server:即使没有调试信息,thread apply all where 的输出也可能指出问题所在。

【讨论】:

以上是关于GDB - 未找到调试符号 -的主要内容,如果未能解决你的问题,请参考以下文章

GDB 符号来自哪里?

未找到符号:kUTTypeImage

Linux:性能最高,未找到内核符号

我看不到使用 gdb 加载的 coredump 的符号

X11。未找到符号:_CGLGetCurrentContext

NASM 和 GDB 符号:“在符号文件中找不到任何代码段。”