c/c++基础(二十六) gdb调试so 教程

当自己开发了一个so文件,如何调试呢?

对与如何编写一个so,请参考文章:http://blog.csdn.net/zz7zz7zz/article/details/41448987

对于如何进行gdb调试,请参考文章:http://blog.csdn.net/zz7zz7zz/article/details/41654457

假设我们的源文件分别是:

filea.c

#include <stdio.h>
void fun1()
{
	printf("i am from filea fun1 \n");
	printf("i am from filea fun11 \n");
	printf("i am from filea fun12 \n");
}

fileb.c

#include <stdio.h>
void fun2()
{
	printf("i am from fileb fun2 \n");
	printf("i am from fileb fun21 \n");
	printf("i am from fileb fun22 \n");
}

CLoadSo.h

#ifndef _CLOADSO_H
#define _CLOADSO_H

#ifdef _cplusplus
	extern "C" {
#endif

	void fun1();
	void fun2();

#ifdef _cplusplus
	}
#endif

#endif

CLoadSo.c

#include <stdio.h>
#include <dlfcn.h>
#include "CLoadSo.h"

int main(int argc,char **argv)
{

	void *soHandle;
	int (*fun)();
	char *errorMsg;

	soHandle=dlopen("first.so",RTLD_LAZY);
	errorMsg=dlerror();

	printf("A1---------loadSo  is %s \n",soHandle ? "success" : "failed");
	if(errorMsg)
	{
		printf("A2--------loadSo error , Msg is: %s \n",errorMsg);
		return -1;
	}

	fun=dlsym(soHandle,"fun1");
	errorMsg=dlerror();
	printf("B1---------fun1 , fun1 is %s \n",fun ? "success" : "Null");
	if(fun)
	{
		fun();
	}
	if(errorMsg)
	{
		printf("B2---------fun1 error , Msg is: %s \n",errorMsg);
	}

	fun=dlsym(soHandle,"fun2");
	errorMsg=dlerror();
	printf("B3---------fun2 , fun2 is %s \n",fun ? "success" : "Null");
	if(fun)
	{
		fun();
	}
	if(errorMsg)
	{
		printf("B4---------fun2 error , Msg is: %s \n",errorMsg);
	}

	fun=dlsym(soHandle,"fun3");
	errorMsg=dlerror();
	printf("B5---------fun3 , fun3 is %s \n",fun ? "success": "Null");
	if(fun)
	{
		fun();
	}
	if(!errorMsg)
	{
		printf("B6---------fun3 error , Msg is: %s \n",errorMsg);
	}

	dlclose(soHandle);
	printf("C---------close LoadSo \n");

	return 0;
}

用命令 gcc -Wall -fpic -g -shared filea.c fileb.c -o first.so 生成first.so文件

用命令 gcc -g -Wall CLoadSo.c -o CLoadSo -ldl
生成可执行文件CLoadSo

gdb步骤如下(请注意观察红色的注释语句):

[[email protected] GdbSo]$ gdb CLoadSo
----------(1).启动gdb调试

GNU gdb (GDB) CentOS (7.0.1-45.el5.centos)
Copyright (C) 2009 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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /disk1/DexYang/Test/GdbSo/CLoadSo...done.
(gdb) l<span style="color: rgb(204, 0, 0); font-family: Arial, Helvetica, sans-serif;"><strong>----------(2).列出加载so的main函数源码</strong></span>
3	#include "CLoadSoFun.h"
4
5	int main(int argc,char **argv)
6	{
7
8		void *soHandle;
9		int (*fun)();
10		char *errorMsg;
11
12		soHandle=dlopen("first.so",RTLD_LAZY);
(gdb) l
13		errorMsg=dlerror();
14
15
16		printf("A1---------loadSo  is %s \n",soHandle ? "success" : "failed");
17		if(errorMsg)
18		{
19			printf("A2--------loadSo error , Msg is: %s \n",errorMsg);
20			return -1;
21		}
22
(gdb) l
23		fun=dlsym(soHandle,"fun1");
24		errorMsg=dlerror();
25		printf("B1---------fun1 , fun1 is %s \n",fun ? "success" : "Null");
26		if(fun)
27		{
28			fun();
29		}
30		if(errorMsg)
31		{
32			printf("B2---------fun1 error , Msg is: %s \n",errorMsg);
(gdb) b 28 <span style="color: rgb(204, 0, 0); font-family: Arial, Helvetica, sans-serif;"><strong>----------(3).在28行处加入断点,也即在fun1函数调用处加入断点</strong></span>
Breakpoint 1 at 0x400723: file CLoadSo.c, line 28.
(gdb) r<strong> <span style="color: rgb(204, 0, 0); font-family: Arial, Helvetica, sans-serif;">----------(4).开始运行程序</span></strong>
Starting program: /disk1/DexYang/Test/GdbSo/CLoadSo
A1---------loadSo  is success
B1---------fun1 , fun1 is success 

Breakpoint 1, main (argc=1, argv=0x7fffffffe638) at CLoadSo.c:28
28			fun();
(gdb) sharedlibrary first.so  <span style="color: rgb(204, 0, 0); font-family: Arial, Helvetica, sans-serif; font-weight: bold;">----------(</span><span style="font-family: Arial, Helvetica, sans-serif; font-weight: bold;"><span style="color:#990000;">5).<span style="font-family: 宋体, Arial; font-size: 14px; line-height: 26px;">sharedlibrary是将动态库的符号读入gdb,为了你能找到变量和函数名。</span></span></span>
Symbols already loaded for first.so
(gdb) s  <span style="color: rgb(204, 0, 0); font-family: Arial, Helvetica, sans-serif; font-weight: bold;">----------(6).进入函数</span>
fun1 () at filea.c:4
4		printf("i am from filea fun1 \n");
(gdb) l <span style="color: rgb(204, 0, 0); font-family: Arial, Helvetica, sans-serif; font-weight: bold;">---------(7).列出函数源代码</span>
1	#include <stdio.h>
2	void fun1()
3	{
4		printf("i am from filea fun1 \n");
5		printf("i am from filea fun11 \n");
6		printf("i am from filea fun12 \n");
7	}
(gdb) n <span style="color: rgb(204, 0, 0); font-family: Arial, Helvetica, sans-serif; font-weight: bold;">---------(8).在函数内单步执行</span>
i am from filea fun1
5		printf("i am from filea fun11 \n");
(gdb) n
i am from filea fun11
6		printf("i am from filea fun12 \n");
(gdb) n
i am from filea fun12
7	}
(gdb) n
main (argc=1, argv=0x7fffffffe638) at CLoadSo.c:30
30		if(errorMsg)
(gdb) n
35		fun=dlsym(soHandle,"fun2");
(gdb) c  <span style="color: rgb(204, 0, 0); font-family: Arial, Helvetica, sans-serif; font-weight: bold;">---------(9).继续直到程序执行完</span>
Continuing.
B3---------fun2 , fun2 is success
i am from fileb fun2
i am from fileb fun21
i am from fileb fun22
B5---------fun3 , fun3 is Null
C---------close LoadSo 

Program exited normally.
(gdb) 

结果:成功进入到了so的fun1中

大概步骤:

1.启动gdb调试:gdb CLoadSo

2.打断点 gdb) : break 28

3.执行 gdb) : run

4.将动态库的符号读入gdb,为了你能找到变量和函数名 gdb)sharedlibrary first.so

5.s进入函数,l列出源代码,n单步执行,直到结束.

时间: 2024-11-13 06:44:40

c/c++基础(二十六) gdb调试so 教程的相关文章

Bootstrap &lt;基础二十六&gt;进度条

Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet Explorer 9 及之前的版本和旧版的 Firefox 不支持该特性,Opera 12 不支持动画. 默认的进度条 创建一个基本的进度条的步骤如下: 添加一个带有 class .progress 的 <div>. 接着,在上面的 <div> 内,添加一个带有 class .prog

Bootstrap &lt;基础二十八&gt;列表组

列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 class .list-group-item. 下面的实例演示了这点: <!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 基本的列表组</title> <link href="/boo

二十六:Struts2 和 spring整合

二十六:Struts2 和 spring整合 将项目名称为day29_02_struts2Spring下的scr目录下的Struts.xml文件拷贝到新项目的scr目录下 在新项目的WebRoot---->WEB-INF目录下新建一个目录lib,用于存放jar包(Struts2和spring整合所需jar包) 将项目名称为day29_02_struts2Spring,WebRoot---->WEB-INF下的lib目录下的所有jar包拷贝到新项目对应的位置,同时将spring的配置文件appl

Bootstrap &lt;基础二十五&gt;警告(Alerts)

警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个可选的关闭按钮.为了创建一个内联的可取消的警告框,请使用 警告(Alerts) jQuery 插件. 您可以通过创建一个 <div>,并向其添加一个 .alert class 和四个上下文 class(即 .alert-success..alert-info..alert-warning..ale

Bootstrap &lt;基础二十二&gt;超大屏幕(Jumbotron)

Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: 创建一个带有 class .jumbotron. 的容器 <div>. 除了更大的 <h1>,字体粗细 font-weight 被减为 200px. 下面的实例演示了这点: <!DOCTYPE html> <html> <head> <tit

二十六、Jcreator使用初步

摘自http://blog.csdn.net/liujun13579/article/details/7751464 二十六.Jcreator使用初步 Jcreator是一个小巧灵活的Java开发工具,它可将Java的程序的编写.编译.运行和调试集成进自身的环境中直接进行开发,且无需进行环境变量的设定.我们可以直接在JCreator中编辑Java源文件,选择相应的菜单和点击对应的按钮就可以完成Java程序的编译.运行等工作,十分方便 由于Jcreator集成了编辑源文件.编译.运行调试为一体,所

shell基础二十篇

shell基础二十篇 编者按:由 wingger  整理的 shell基础十二篇 以及L_kernel补充的第十三--二十篇,涉及shell 编程及使用的各个方面,又附有大量的例子,极适合初学者系统学习.如果配合網中人的shell 十三問? ,效果更加明显. 这里是其中的第十章 sed.  其他各章可察看相应的 link. shell基础1:文件安全与权限 http://bbs.chinaunix.net/thread-434579-1-1.html 附:Linux的用户和用户组管理 http:

Bootstrap&lt;基础二十&gt; 标签

Bootstrap 标签.标签可用于计数.提示或页面上其他的标记显示.使用 class .label 来显示标签,如下面的实例所示: <!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 标签</title> <link href="/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <s

Bootstrap&lt;基础二十四&gt; 缩略图

Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 class .thumbnail 的 <a> 标签. 这会添加四个像素的内边距(padding)和一个灰色的边框. 当鼠标悬停在图像上时,会动画显示出图像的轮廓. 下面的实例演示了默认的缩略图: <!DOCTYPE html> <html> <head> &l