linux - 如何让 gdb 从已安装的库中加载符号?

标签 linux debugging gdb debian debug-symbols

libopal-dbglibopal3.10.10 已安装。但是调试的时候看不到库代码。

objdump --debugging/usr/lib/libopal.so.3.10.10 给出:

00000018 0000000000000024 0000001c FDE cie=00000000 pc=00000000006a61c0..00000000006f82b0
  DW_CFA_def_cfa_offset: 16
  DW_CFA_advance_loc: 6 to 00000000006a61c6
  DW_CFA_def_cfa_offset: 24
  DW_CFA_advance_loc: 10 to 00000000006a61d0
  DW_CFA_def_cfa_expression (DW_OP_breg7 (rsp): 8; DW_OP_breg16 (rip): 0; DW_OP_lit15; DW_OP_and; DW_OP_lit11; DW_OP_ge; DW_OP_lit3; DW_OP_shl; DW_OP_plus)
  DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop

...

有趣的是 objdump --debugging/usr/lib/debug/usr/lib/libopal.so.3.10.10 什么都不输出:

/usr/lib/debug/usr/lib/libopal.so.3.10.10:     file format elf64-x86-64

Contents of the .eh_frame section:

00000000 ZERO terminator

调试时,没有给出行号:

(gdb) n
Single stepping until exit from function _ZN12RTP_Encoding10WaitForPDUER10PUDPSocketS1_RK13PTimeInterval,
which has no line number information.
0x00007ffff5d73641 in RTP_UDP::WaitForPDU(PUDPSocket&, PUDPSocket&, PTimeInterval const&) () from /usr/lib/libopal.so.3.10.10
(gdb) list
77  in ../sysdeps/unix/syscall-template.S
(gdb) n
Single stepping until exit from function _ZN7RTP_UDP10WaitForPDUER10PUDPSocketS1_RK13PTimeInterval,
which has no line number information.
0x00007ffff5d731e3 in RTP_UDP::Internal_ReadData(RTP_DataFrame&) () from /usr/lib/libopal.so.3.10.10

或者像在 ptlib 中那样(还安装了 libpt-dbglibpt-1.10.10):

(gdb) 
0x00007ffff52922c0 in PSocket::Select(PSocket::SelectList&, PSocket::SelectList&, PSocket::SelectList&, PTimeInterval const&) () from /usr/lib/libpt.so.2.10.10
(gdb) 
Single stepping until exit from function _ZN7PSocket6SelectERNS_10SelectListES1_S1_RK13PTimeInterval,
which has no line number information.
0x00007ffff52bc0e9 in PSocket::Select(PSocket&, PSocket&, PTimeInterval const&) () from /usr/lib/libpt.so.2.10.10
(gdb) lis
2946    in malloc.c
(gdb) s
Single stepping until exit from function _ZN7PSocket6SelectERS_S0_RK13PTimeInterval,
which has no line number information.
0x00007ffff5d736b7 in RTP_UDP::Internal_WaitForPDU(PUDPSocket&, PUDPSocket&, PTimeInterval const&) () from /usr/lib/libopal.so.3.10.10
(gdb) lis
2946    in malloc.c

最佳答案

好的,今天交易以下黑客:

执行apt-get source libpt-dbg,并修补debian/rules:

--- a/debian/rules  2016-03-23 14:25:56.067355795 +0100
+++ b/debian/rules  2016-03-23 11:53:11.384111449 +0100
@@ -23,7 +23,7 @@
    dh_auto_configure -- --enable-oss --enable-v4l --disable-avc --disable-dc --enable-exceptions

 override_dh_auto_build:
-   dh_auto_build -- optshared docs
+   dh_auto_build -- debugshared docs

 override_dh_strip:
    dh_strip -a --dbg-package=libpt-dbg
@@ -35,7 +35,7 @@

 override_dh_auto_test:
    $(MAKE) PTLIBDIR=$(CURDIR) -C samples/hello_world clean
-   $(MAKE) PTLIBDIR=$(CURDIR) -C samples/hello_world opt
+   $(MAKE) PTLIBDIR=$(CURDIR) -C samples/hello_world debug
    #if (samples/hello_world/obj*/hello 2>/dev/null);then \
    #   echo opt hello_world sample incorrectly compiled static; false ; \
    #else \

同时将实际源代码的补丁添加到补丁中(导入或更新 debian/patches 目录):

Index: ptlib-2.10.10~dfsg/Makefile.in
===================================================================
--- ptlib-2.10.10~dfsg.orig/Makefile.in
+++ ptlib-2.10.10~dfsg/Makefile.in
@@ -83,7 +83,7 @@ ifeq (,$(findstring $(OSTYPE),Darwin cyg
   DEBUG_SONAME = $(PTLIB_DEBUG_FILE).@MAJOR_VERSION@.@MINOR_VERSION@@BUILD_TYPE@@BUILD_NUMBER@
 else
   LIB_SONAME   = $(subst .$(LIB_SUFFIX),.@MAJOR_VERSION@.@MINOR_VERSION@@BUILD_TYPE@@BUILD_NUMBER@.$(LIB_SUFFIX),$(PTLIB_FILE))
-  DEBUG_SONAME = $(subst .$(LIB_SUFFIX),.@MAJOR_VERSION@.@MINOR_VERSION@@BUILD_TYPE@@BUILD_NUMBER@._d$(LIB_SUFFIX),$(PTLIB_FILE))
+  DEBUG_SONAME = $(subst .$(LIB_SUFFIX),.@MAJOR_VERSION@.@MINOR_VERSION@@BUILD_TYPE@@BUILD_NUMBER@.$(LIB_SUFFIX),$(PTLIB_FILE))
 endif

 # all these targets are just passed to all subdirectories
Index: ptlib-2.10.10~dfsg/make/unix.mak
===================================================================
--- ptlib-2.10.10~dfsg.orig/make/unix.mak
+++ ptlib-2.10.10~dfsg/make/unix.mak
@@ -596,7 +596,7 @@ endif

 ifndef OBJ_SUFFIX
 ifdef  DEBUG
-OBJ_SUFFIX := _d
+OBJ_SUFFIX :=
 else
 OBJ_SUFFIX :=
 endif # DEBUG
@@ -663,7 +663,7 @@ PT_LIBDIR   = $(PTLIBDIR)/lib_$(PLATFORM_T
 # set name of the PT library
 PTLIB_BASE = pt$(OBJ_SUFFIX)
 PTLIB_FILE = lib$(PTLIB_BASE)$(LIB_TYPE).$(LIB_SUFFIX)
-PTLIB_DEBUG_FILE= lib$(PTLIB_BASE)_d$(LIB_TYPE).$(LIB_SUFFIX)
+PTLIB_DEBUG_FILE= lib$(PTLIB_BASE)$(LIB_TYPE).$(LIB_SUFFIX)
 PT_OBJBASE = obj$(OBJDIR_SUFFIX)
 PT_OBJDIR  = $(PT_LIBDIR)/$(PT_OBJBASE)

然后使用 debuild -us -uc -i -I 构建包。

接下来是蛋白石(apt-get source libopal-dbg)。修补 debian/rules:

--- a/debian/rules  2016-03-23 15:55:49.460972494 +0100
+++ b/debian/rules  2016-03-23 15:24:37.685361838 +0100
@@ -23,7 +23,7 @@

 override_dh_auto_build:
    sed -e 's#^Libs: #Libs: -L$(OPAL_LIBDIR) #' opal.pc >samples/opal.pc
-   dh_auto_build -- PKG_CONFIG_PATH=$(CURDIR)/samples VERBOSE=1 opt docs
+   dh_auto_build -- PKG_CONFIG_PATH=$(CURDIR)/samples VERBOSE=1 debug docs

 #override_dh_auto_test:
 #  if (samples/simple/obj*/simpleopal --help >/dev/null);then \

将补丁添加到源补丁目录:

Index: opal-3.10.10~dfsg2/Makefile.in
===================================================================
--- opal-3.10.10~dfsg2.orig/Makefile.in
+++ opal-3.10.10~dfsg2/Makefile.in
@@ -560,7 +560,7 @@ $(OPAL_DEPDIR)/%.dep : %.c
 .PHONY: default_target

 ifeq ($(OPAL_SHARED_LIB),)
-default_target :: opt
+default_target :: debug
 else
 default_target :: Makefile $(OPAL_LIBDIR)/$(LIB_FILENAME_STATIC)
 ifeq ($(OPAL_SHARED_LIB),1)
Index: opal-3.10.10~dfsg2/configure
===================================================================
--- opal-3.10.10~dfsg2.orig/configure
+++ opal-3.10.10~dfsg2/configure
@@ -4919,7 +4919,7 @@ fi
             PTLIB_LIBS=`$PKG_CONFIG ptlib --libs`

             RELEASE_LIBS=`$PKG_CONFIG ptlib --libs`
-            DEBUG_LIBS=`$PKG_CONFIG ptlib --define-variable=suffix=_d --libs`
+            DEBUG_LIBS=`$PKG_CONFIG ptlib --libs`

                     else
             if test "x${PTLIB_VERSION_CHECK}" = "xyes" ; then
@@ -5113,7 +5113,7 @@ fi

             PTLIB_VERSION=`$PKG_CONFIG ptlib --modversion`
             PTLIB_CXXFLAGS=`$PKG_CONFIG ptlib --variable=cxxflags`
-            DEBUG_LIBS=`$PKG_CONFIG ptlib --define-variable=suffix=_d --libs`
+            DEBUG_LIBS=`$PKG_CONFIG ptlib --libs`
             RELEASE_LIBS="$PTLIB_LIBS"
           fi

@@ -5133,7 +5133,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
           { $as_echo "$as_me:${as_lineno-$LINENO}: checking linkable PTLib" >&5
 $as_echo_n "checking linkable PTLib... " >&6; }

-          DEBUG_LIBS=`$PKG_CONFIG ptlib --define-variable=suffix=_d --libs`
+          DEBUG_LIBS=`$PKG_CONFIG ptlib --libs`
           RELEASE_LIBS=`$PKG_CONFIG ptlib --libs`

            suffix=""""""
@@ -5174,7 +5174,7 @@ rm -f core conftest.err conftest.$ac_obj
 $as_echo "opt, shared" >&6; }
           else

-           suffix="_d"""
+           suffix=""""
       if test "x$suffix" = "x" ; then
              LIBS=`$PKG_CONFIG ptlib "" --libs`
            else
@@ -5211,7 +5211,7 @@ rm -f core conftest.err conftest.$ac_obj
               { $as_echo "$as_me:${as_lineno-$LINENO}: result: debug, shared" >&5
 $as_echo "debug, shared" >&6; }
             else
-              DEBUG_LIBS=`$PKG_CONFIG ptlib --static --define-variable=suffix=_d_s --libs`
+              DEBUG_LIBS=`$PKG_CONFIG ptlib --static --define-variable=suffix=_s --libs`
               RELEASE_LIBS=`$PKG_CONFIG ptlib --static --define-variable=suffix=_s --libs`

            suffix="""_s"
@@ -5252,7 +5252,7 @@ rm -f core conftest.err conftest.$ac_obj
 $as_echo "release, static" >&6; }
               else

-           suffix="_d_s"
+           suffix="_s"
       if test "x$suffix" = "x" ; then
              LIBS=`$PKG_CONFIG ptlib --static --libs`
            else
@@ -5362,7 +5362,7 @@ case "$OSTYPE" in
           SHARED_CFLAGS="-KPIC -D__inline=inline"

           if test "xDEBUG" = "xDEBUG" ; then
-            OBJ_SUFFIX="_d"
+            OBJ_SUFFIX=""
           else
             OBJ_SUFFIX=""
           fi
@@ -5396,7 +5396,7 @@ case "$OSTYPE" in


           if test "xRELEASE" = "xDEBUG" ; then
-            OBJ_SUFFIX="_d"
+            OBJ_SUFFIX=""
           else
             OBJ_SUFFIX=""
           fi
@@ -5438,7 +5438,7 @@ case "$OSTYPE" in
           SHARED_CFLAGS="-fPIC"

           if test "xDEBUG" = "xDEBUG" ; then
-            OBJ_SUFFIX="_d"
+            OBJ_SUFFIX=""
           else
             OBJ_SUFFIX=""
           fi
@@ -5472,7 +5472,7 @@ case "$OSTYPE" in


           if test "xRELEASE" = "xDEBUG" ; then
-            OBJ_SUFFIX="_d"
+            OBJ_SUFFIX=""
           else
             OBJ_SUFFIX=""
           fi
@@ -5521,7 +5521,7 @@ case "$OSTYPE" in
           SHARED_CFLAGS=

           if test "xDEBUG" = "xDEBUG" ; then
-            OBJ_SUFFIX="_d"
+            OBJ_SUFFIX=""
           else
             OBJ_SUFFIX=""
           fi
@@ -5555,7 +5555,7 @@ case "$OSTYPE" in


           if test "xRELEASE" = "xDEBUG" ; then
-            OBJ_SUFFIX="_d"
+            OBJ_SUFFIX=""
           else
             OBJ_SUFFIX=""
           fi
@@ -5596,7 +5596,7 @@ case "$OSTYPE" in
           SHARED_CFLAGS="-fPIC"

           if test "xDEBUG" = "xDEBUG" ; then
-            OBJ_SUFFIX="_d"
+            OBJ_SUFFIX=""
           else
             OBJ_SUFFIX=""
           fi
@@ -5630,7 +5630,7 @@ case "$OSTYPE" in


           if test "xRELEASE" = "xDEBUG" ; then
-            OBJ_SUFFIX="_d"
+            OBJ_SUFFIX=""
           else
             OBJ_SUFFIX=""
           fi
@@ -5672,7 +5672,7 @@ case "$OSTYPE" in
           SHARED_CFLAGS="-fPIC"

           if test "xDEBUG" = "xDEBUG" ; then
-            OBJ_SUFFIX="_d"
+            OBJ_SUFFIX=""
           else
             OBJ_SUFFIX=""
           fi
@@ -5706,7 +5706,7 @@ case "$OSTYPE" in


           if test "xRELEASE" = "xDEBUG" ; then
-            OBJ_SUFFIX="_d"
+            OBJ_SUFFIX=""
           else
             OBJ_SUFFIX=""
           fi
Index: opal-3.10.10~dfsg2/opal.m4
===================================================================
--- opal-3.10.10~dfsg2.orig/opal.m4
+++ opal-3.10.10~dfsg2/opal.m4
@@ -154,7 +154,7 @@ dnl            $LIB_FILENAME_SHARED_PAT
 AC_DEFUN([OPAL_DETERMINE_LIBNAMES],
          [
           if test "x$1" = "xDEBUG" ; then
-            OBJ_SUFFIX="_d"
+            OBJ_SUFFIX=""
           else
             OBJ_SUFFIX=""
           fi
Index: opal-3.10.10~dfsg2/samples/simple/Makefile
===================================================================
--- opal-3.10.10~dfsg2.orig/samples/simple/Makefile
+++ opal-3.10.10~dfsg2/samples/simple/Makefile
@@ -35,7 +35,7 @@ endif

 # Determine which package to use debug or release
 ifeq ($(DEBUG_BUILD), yes)
-DEBUG_SUFFIX=_d
+DEBUG_SUFFIX=
 CFLAGS += -g
 else
 DEBUG_SUFFIX=

使用 debuild -us -uc -i -I 构建包。

关于linux - 如何让 gdb 从已安装的库中加载符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36172421/

相关文章:

eclipse - Eclipse 的 BPEL 设计器 : how to debug a BPEL process

将 libc 回溯转换为源代码行号

c - ELF 二进制分析静态与动态。汇编代码如何|指令内存映射变化?

Linux 命令行 - 列出所有包含 .js 文件的目录,并将目录及其内容复制到一个新文件夹中

linux - 在 bash 上查找图像,无论扩展名如何

用于 curl/curl.h 的 Linux 中的 C/C++

objective-c - 在 iOS 上调试线程安全问题

android - 某些 androids 应用程序无法通过 fiddler 连接

c++ - gdb中的nexti和stepi有什么区别?

python - 使用 python 验证 apache 状态的脚本