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 main GNU gdb (Ubuntu 7.7-0ubuntu3) 7.7 Copyright (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 TestObj Breakpoint 1 at 0x400910 (gdb) r Starting program: /home/solidmango/testmake/Test_L1/main Enter two numbers: 7 8 The sum of 7 and 8 is 15 I am in a function! Breakpoint 1, 0x0000000000400910 in TestObj()@plt () (gdb) s Single stepping until exit from function _Z7TestObjv@plt, which has no line number information. TestObj () at testobj.cc:3 3 { (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 Library 0x00007ffff7ddaae0 0x00007ffff7df54e0 Yes /lib64/ld-linux-x86-64.so.2 0x00007ffff7bd8850 0x00007ffff7bd89c5 Yes /lib/libtest.so 0x00007ffff792f5c0 0x00007ffff799299a Yes (*) /usr/lib/x86_64-linux-gnu/libstdc++.so.6 0x00007ffff752d4a0 0x00007ffff7673413 Yes /lib/x86_64-linux-gnu/libc.so.6 0x00007ffff720d610 0x00007ffff727c1b6 Yes /lib/x86_64-linux-gnu/libm.so.6 0x00007ffff6ff4ab0 0x00007ffff7004995 Yes (*) /lib/x86_64-linux-gnu/libgcc_s.so.1 (*): Shared library is missing debugging information. (gdb) list 1 #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, 源文件,可操作性极强,建议感兴趣的朋友亲自动手操作演练,希望对大家有所帮助。