4. GDB调试动态链接库对于动态链接库的调试和单个的执行文件差别较大,相对于静态链接库的调试只需要对makefile
稍作修改,具体改动如下:
生成相应的动态库并copy到系统目录
g++ -g -c -fPIC -o testobj.o testobj.cc
g++ -g -shared -o libtest.so testobj.o
sudo cp libtest.so /lib/libtest.so
makefile
CC=gcc
CXX=g++
RM=rm -f
CPPFLAGS=-g
LDFLAGS=-g
LDLIBS=-ltest
AR=ar
SRCS=main.cc functions.cc
OBJS=$(subst .cc,.o,$(SRCS))
all: main
main: $(OBJS) libtest.so
$(CXX) $(LDFLAGS) -o main $(OBJS) -L. $(LDLIBS)
main.o: main.cc functions.h testobj.h
functions.o: functions.h functions.cc
clean:
$(RM) $(OBJS)
all-clean: clean
$(RM) main
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
调试结果如下:<br>solidmango@solidmango-pc:~/testmake/Test_L1$ gdb mainGNU gdb (Ubuntu 7.7-0ubuntu3) 7.7Copyright (C) 2014 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law. Type "show copying"and "show warranty" for details.This GDB was configured as "x86_64-linux-gnu".Type "show configuration" for configuration details.For bug reporting instructions, please see:<http://www.gnu.org/software/gdb/bugs/>.Find the GDB manual and other documentation resources online at:<http://www.gnu.org/software/gdb/documentation/>.For help, type "help".Type "apropos word" to search for commands related to "word"...Reading symbols from main...done.(gdb) b TestObjBreakpoint 1 at 0x400910(gdb) rStarting program: /home/solidmango/testmake/Test_L1/main Enter two numbers:78The sum of 7 and 8 is 15I am in a function!Breakpoint 1, 0x0000000000400910 in TestObj()@plt ()(gdb) sSingle stepping until exit from function _Z7TestObjv@plt,which has no line number information.TestObj () at testobj.cc:33 {(gdb) bt#0 TestObj () at testobj.cc:3#1 0x0000000000400b05 in main () at main.cc:17(gdb) info sharedlibrary From To Syms Read Shared Object Library0x00007ffff7ddaae0 0x00007ffff7df54e0 Yes /lib64/ld-linux-x86-64.so.20x00007ffff7bd8850 0x00007ffff7bd89c5 Yes /lib/libtest.so0x00007ffff792f5c0 0x00007ffff799299a Yes (*) /usr/lib/x86_64-linux-gnu/libstdc++.so.60x00007ffff752d4a0 0x00007ffff7673413 Yes /lib/x86_64-linux-gnu/libc.so.60x00007ffff720d610 0x00007ffff727c1b6 Yes /lib/x86_64-linux-gnu/libm.so.60x00007ffff6ff4ab0 0x00007ffff7004995 Yes (*) /lib/x86_64-linux-gnu/libgcc_s.so.1(*): Shared library is missing debugging information.(gdb) list1 #include<iostream>2 int TestObj(void)3 {4 std::cout << "I am in TestObj!" << std::endl;5 return 0;6 }(gdb) |
总结
本文总结了Linux下基于GDB的3种情况的调试方式,其中包括单个可执行文件,静态链接,动态链接,并给出了完整的makefile, 源文件,可操作性极强,建议感兴趣的朋友亲自动手操作演练,希望对大家有所帮助。
