当前位置: 技术问答>linux和unix
GDB调试动态库so问题?
来源: 互联网 发布时间:2015-12-24
本文导语: #get.h 头文件内容如下: int get (); int set (int a); #get.cpp 文件内容如下: #include #include "get.h" static int x=0; int get () { printf ("get x=%dn", x); return x; } int set (int a) { printf ("s...
#get.h 头文件内容如下:
int get ();
int set (int a);
#get.cpp 文件内容如下:
#include
#include "get.h"
static int x=0;
int get ()
{
printf ("get x=%dn", x);
return x;
}
int set (int a)
{
printf ("set a=%dn", a);
x = a;
return x;
}
编译为库文件:gcc get.cpp -shared -g -DDEBUG -o libggg.so
测试程序pk.cpp如下
#include
#include "get.h"
int main (int argc, char** argv)
{
int a = 100;
int b = get ();
int c = set (a);
int d = get ();
printf ("a=%d,b=%d,c=%d,d=%dn",a,b,c,d);
return 0;
}
编译后执行app,输出正确,现在需要调试库文件,要在get函数,set函数里设置断点。
gdb app
b main
run
b get
此时提示 :Cannot access memory at address 0x5cc,
请问各位大侠,该如何在库的源文件里设置断点呀?所有的文件都在同一个目录里的呀。
int get ();
int set (int a);
#get.cpp 文件内容如下:
#include
#include "get.h"
static int x=0;
int get ()
{
printf ("get x=%dn", x);
return x;
}
int set (int a)
{
printf ("set a=%dn", a);
x = a;
return x;
}
编译为库文件:gcc get.cpp -shared -g -DDEBUG -o libggg.so
测试程序pk.cpp如下
#include
#include "get.h"
int main (int argc, char** argv)
{
int a = 100;
int b = get ();
int c = set (a);
int d = get ();
printf ("a=%d,b=%d,c=%d,d=%dn",a,b,c,d);
return 0;
}
编译后执行app,输出正确,现在需要调试库文件,要在get函数,set函数里设置断点。
gdb app
b main
run
b get
此时提示 :Cannot access memory at address 0x5cc,
请问各位大侠,该如何在库的源文件里设置断点呀?所有的文件都在同一个目录里的呀。
|
vcclass (黑山老妖)你好,下面是我的测试结果。
1)文件列表:
> ls -l
-rw-r--r-- 1 hchen wheel 209 Nov 16 11:08 get.c
-rw-r--r-- 1 hchen wheel 28 Nov 16 11:07 get.h
-rw-r--r-- 1 hchen wheel 237 Nov 16 11:08 main.c
-rw-r--r-- 1 hchen wheel 213 Nov 16 11:52 makefile
2)Makefile的样子
> cat ./makefile
all:main
libget.so:get.c
gcc -g -c -o get.o get.c
gcc -g -shared -o libget.so get.o
main:main.c libget.so
gcc -g -c -o main.o main.c
gcc -g -o main main.o -L./ -lget
clean:
@rm libget.so get.o main.o main
3)编译程序
> make
gcc -g -c -o get.o get.c
gcc -g -shared -o libget.so get.o
gcc -g -c -o main.o main.c
gcc -g -o main main.o -L./ -lget
4)设置LD_LIBRARY_PATH环境变量
> setenv LD_LIBRARY_PATH ${PWD}
> env | grep LD
LD_LIBRARY_PATH=/home/hchen/test/so
5)用GDB调试(step in)
> gdb ./main
(gdb) break main
Breakpoint 1 at 0x80484d0: file main.c, line 5.
(gdb) r
Starting program: /home/hchen/test/so/main
Breakpoint 1, main (argc=1, argv=0xbfe62fc4) at main.c:5
5 int a = 100;
(gdb) n
6 int b = get ();
(gdb) s
1)文件列表:
> ls -l
-rw-r--r-- 1 hchen wheel 209 Nov 16 11:08 get.c
-rw-r--r-- 1 hchen wheel 28 Nov 16 11:07 get.h
-rw-r--r-- 1 hchen wheel 237 Nov 16 11:08 main.c
-rw-r--r-- 1 hchen wheel 213 Nov 16 11:52 makefile
2)Makefile的样子
> cat ./makefile
all:main
libget.so:get.c
gcc -g -c -o get.o get.c
gcc -g -shared -o libget.so get.o
main:main.c libget.so
gcc -g -c -o main.o main.c
gcc -g -o main main.o -L./ -lget
clean:
@rm libget.so get.o main.o main
3)编译程序
> make
gcc -g -c -o get.o get.c
gcc -g -shared -o libget.so get.o
gcc -g -c -o main.o main.c
gcc -g -o main main.o -L./ -lget
4)设置LD_LIBRARY_PATH环境变量
> setenv LD_LIBRARY_PATH ${PWD}
> env | grep LD
LD_LIBRARY_PATH=/home/hchen/test/so
5)用GDB调试(step in)
> gdb ./main
(gdb) break main
Breakpoint 1 at 0x80484d0: file main.c, line 5.
(gdb) r
Starting program: /home/hchen/test/so/main
Breakpoint 1, main (argc=1, argv=0xbfe62fc4) at main.c:5
5 int a = 100;
(gdb) n
6 int b = get ();
(gdb) s