gdb命令中attach使用

[测试程序]
我们先看看我们的测试程序:
/* in eg1.c */

int wib(int no1, int no2)
{
        int result, diff;
        diff = no1 - no2;
        result = no1 / diff;
        return result;
}

int main()
{
        pid_t   pid;

        pid = fork();
        if (pid <0) {
                printf("fork err\n");
                exit(-1);
        } else if (pid == 0) {
                /* in child process */
                sleep(60); ------------------ (!)

                int     value   = 10;
                int     div     = 6;
                int     total   = 0;
                int     i       = 0;
                int     result = 0;

                for (i = 0; i < 10; i++) {
                        result = wib(value, div);
                        total += result;
                        div++;
                        value--;
                }

                printf("%d wibed by %d equals %d\n", value, div, total);
                exit(0);
        } else {
                /* in parent process */
                sleep(4);
                wait(-1);
                exit(0);
        }
}
该测试程序中子进程运行过程中会在wib函数中出现一个'除0'异常。现在我们就要调试该子进程。

[调试原理]
不知道大家发现没有,在(!)处在我们的测试程序在父进程fork后,子进程调用sleep睡了60秒。这就是关键,这个sleep本来是不该存在于子进程代码中的,而是而了使用GDB调试后加入的,它是我们调试的一个关键点。为什么要让子进程刚刚运行就开始sleep呢?因为我们要在子进程睡眠期间,利用 shell命令获取其process id,然后再利用gdb调试外部进程的方法attach到该process id上,调试该进程。

[调试过程]
我觉上面的调试原理的思路已经很清晰了,剩下的就是如何操作的问题了。我们来实践一次吧!
我所使用的环境Solaris OS 9.0/GCC 3.2/GDB 6.1

GDB 调试程序的前提条件就是你编译程序时必须加入调试符号信息,即使用'-g'编译选项。首先编译我们的源程序'gcc -g -o eg1 eg1.c'。编译好之后,我们就有了我们的调试目标eg1。由于我们在调试过程中需要多个工具配合,所以你最好多打开几个终端窗口,另外一点需要注意的是最好在eg1的working directory下执行gdb程序,否则gdb回提示'No symbol table is loaded'。你还得手工load symbol table。好了,下面我们就'按部就班'的开始调试我们的eg1。

执行eg1:
eg1 &   --- 让eg1后台运行吧。

查找进程id:
ps -fu YOUR_USER_NAME

运行gdb:
gdb
(gdb) attach xxxxx --- xxxxx为利用ps命令获得的子进程process id
(gdb) stop --- 这点很重要,你需要先暂停那个子进程,然后设置一些断点和一些Watch
(gdb) break 37 -- 在result = wib(value, div);这行设置一个断点,可以使用list命令察看源代码
Breakpoint 1 at 0x10808: file eg1.c, line 37.
(gdb) 
continue
Continuing.

Breakpoint 1, main () at eg1.c:37
37                              result = wib(value, div);
(gdb) step
wib (no1=10, no2=6) at eg1.c:13
13              diff = no1 - no2;
(gdb) continue
Continuing.

Breakpoint 1, main () at eg1.c:37
37                              result = wib(value, div);
(gdb) step
wib (no1=9, no2=7) at eg1.c:13
13              diff = no1 - no2;
(gdb) continue
Continuing.

Breakpoint 1, main () at eg1.c:37
37                              result = wib(value, div);
(gdb) step
wib (no1=8, no2=8) at eg1.c:13
13              diff = no1 - no2;
(gdb) next
14              result = no1 / diff;
(gdb)
 print diff
$6 = 0        ------- 除数为0,我们找到罪魁祸首了。
(gdb) next
Program received signal SIGFPE, Arithmetic exception.
0xff29d830 in .div () from /usr/lib/libc.so.1

至此,我们调试完毕。

转载于:https://www.cnblogs.com/djzny/p/4956752.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java%4d_java积累

数组的使用package javaDemo;import java.util.*;/**** author Administrator* version 1.0***/public class test {public static void main(String[] args){String[] greeting new String[3];greeting[0] "Welcome to Core Java";greeting[1] "by Cay Hors…

查询CPU占用高的SQL语句的解决方案

触发器造成死锁、作业多且频繁、中间表的大量使用、游标的大量使用、索引的设计不合理、事务操作频繁、SQL语句设计不合理&#xff0c;都会造成查询效率低下、影响服务器性能的发挥。我们可以使用sql server自带的性能分析追踪工具sql profiler分析数据库设计所产生问题的来源&…

父类与子类之间的关系

1) 运行课件中的例题ParentChildTest.java&#xff0c;回答下列问题&#xff1a; a) 左边的程序运行结果是什么&#xff1f; b) 你如何解释会得到这样的输出&#xff1f; 第一个创建一个Parent对象&#xff0c;调用的是父类构造方法 第二个创建一个Child对象&#xff0c;调用的…

php获取到的json数据如何处理_php – 如何从API获取JSON数据

我使用过雅虎的符号查找它以JSON格式返回数据.喜欢以下YAHOO.Finance.SymbolSuggest.ssCallback({"ResultSet": {"Query": "ya","Result": [{"symbol": "YHOO","name": "Yahoo! Inc.","…

.NET开发中应该遵循的几点建议

1、始终控制类的大小那些超大的类在尝试做太多的事情&#xff0c;这违反了单一职责原则&#xff0c; 为什么一定要将两个职责分离到单独的类中呢&#xff1f;因为每一个职责都是变化的中心。在需求变更时&#xff0c;这个变更将会出现在负责该职责的类中。如果一个类承担了多个…

Linux下jetty报java.lang.OutOfMemoryError: PermGen space及Jetty内存配置调优解决方案

Linux下的jetty报java.lang.OutOfMemoryError: PermGen space及Jetty内存配置调优解决方案问题linux的jetty下发布程序后再启动jetty服务时&#xff0c;发现启动不了&#xff0c;从日志中找到报java.lang.OutOfMemoryError: PermGen space。原因分析PermGen space&#xff0c;全…

微博php sdk,手机第三方新浪微博登录php api实现分析

提供api&#xff0c;POST方式&#xff0c;根据传递过来的微博uid/appkey&#xff0c;判断该用户的ID是否在自己的数据库中。如果有&#xff0c;直接登录返回用户登录api的json。如果没有&#xff0c;就将该用户的IDtoken请求微博用户信息api&#xff1a;http://open.weibo.com/…

13条只有程序员才能懂的内涵段子

一、bug跟蚊子的相似之处&#xff1a;1、不知道藏在哪里。2、不知道有多少。3、总是在你即将睡觉休息的时候出现。二、A&#xff1a;最近在看《一拳超人》&#xff0c;觉得咱们程序猿跟埼玉老师有点像啊&#xff01;B&#xff1a;哪里像了&#xff1f;A&#xff1a;越秃越强&am…

Posix消息队列

一、函数 mq_open 头文件 mqueue.h&#xff1b; 原型 mqd_t mq_open(const char *name, int oflag, .../*mode_t mode,struct mq_attr* attr*/); 函数功能 创建消息队列&#xff1b; 参数 name &#xff1a;消息队列的名字&#xff0c;根据消息队列的规则&#xff0c;为了更好的…

php 等值线,【地理】攻克等值线的六大法门

3.等值线数值大小的判断方法(1)通常情况下&#xff0c;据图中已标注的等值线进行分析标注&#xff0c;标注时注意&#xff1a;①等值线数值的递变规律&#xff1b;②相邻两条等值线差值的大小。(2)在闭合的等值线上&#xff0c;除据以上方法判断外&#xff0c;还可用“大于…

4步win7下简单FTP服务器搭建(试验成功)

本文介绍通过win7自带的IIS来搭建一个只能实现基本功能的FTP服务器&#xff0c;第一次装好WIN7后我愣是没整出来&#xff0c;后来查了一下网上资料经过试验后搭建成功&#xff0c;其实原理和步骤与windows前期的版本差不多&#xff0c;主要是对新的操作系统还不是很熟悉。相信用…

C#开发模式——单例模式

一、单例模式简介单例模式是为保证一个对象,在程序运行的任何时刻只有一个实例存在&#xff0c;我们把这种实现方式称之为“单例模式”。二、单例模式的核心单例类只有一个实例存在单例类提供一个全局访问点单例类通过自己创建唯一实例单例类对外所有访问对象都提供一个唯一实例…

video.min.js php,在WordPress中使用videojs来播放七牛私有空间视频

首先&#xff0c;在主题函数文件functions.php中添加一个获取七牛下载凭证的函数。这部分参考function qiniu_download_url($url){$url trim($url, /);$deadline strtotime(1 hour);$url sprintf(%s?e%s, $url, $deadline);$sign hash_hmac(sha1, $url, SECRET_KEY, true)…

关于HTTP和HTTPS的区别

一HTTP和HTTPS的基本概念1、HTTP&#xff1a;是互联网上应用最为广泛的一种网络协议&#xff0c;是一个客户端和服务器端请求和应答的标准&#xff08;TCP&#xff09;&#xff0c;用于从WWW服务器传输超文本到本地浏览器的传输协议&#xff0c;它可以使浏览器更加高效&#xf…

Android 实现切换主题皮肤功能(类似于众多app中的 夜间模式,主题包等)

首先来个最简单的一键切换主题功能&#xff0c;就做个白天和晚上的主题好了。 先看我们的styles文件&#xff1a; 1 <resources>2 3 <!-- Base application theme. -->4 <style name"AppTheme" parent"Theme.AppCompat.Light.DarkAction…

订阅号 图文回复php,微信开发(PHP实现订阅号的公众号配置和自动回复)

首先在微信公众平台(网址&#xff1a;https://mp.weixin.qq.com)申请一个订阅号&#xff0c;然后在开发里找到开发者工具点击公众平台测试账号&#xff0c;在测试账号内进行微信开发实验。 1. 设置一个自己的有效的域名网址和TOKEN(就是暗号)&#xff0c;TOKEN一定要与PHP代…

为何技术领域中女程序员较少?

对于大多数人来说&#xff0c;他们意识中的科技人就是扎克伯格&#xff0c;乔布斯或者是比尔盖茨——经常出现在新闻里的典型的男科技企业家。其实在科技领域还有一些女性&#xff0c;比如苏珊沃西基&#xff08;YouTube的CEO&#xff09;和吉尼罗曼提&#xff08;IBM的CEO&…

This version of MySQL doesn't yet support 'LIMIT IN/ALL/ANY/SOME subquery 解决方法

This version of MySQL doesnt yet support LIMIT & IN/ALL/ANY/SOME subquery的意思是&#xff0c;这版本的 MySQL 不支持使用 LIMIT 子句的 IN/ALL/ANY/SOME 子查询&#xff0c;即是支持非 IN/ALL/ANY/SOME 子查询的 LIMIT 子查询。 也就是说&#xff0c;这样的语句是不能…

php 递归分销角色,PHP递归无限分类

我们面试程序开发的时候&#xff0c;经常会被问到递归的问题。今天我们在本文中以“素材火的特效分类表”作为演示&#xff0c;使用PHP递归结合Mysql实现无限级分类。难易&#xff1a;初级下载资源下载积分&#xff1a;50积分递归简单的说就是一段程序代码的重复调用&#xff0…

Android音频系统之AudioPolicyService

地址&#xff1a;http://blog.csdn.net/edmond999/article/details/18599327 1.1 AudioPolicy Service 在AudioFlinger小节&#xff0c;我们反复强调它只是策略的执行者&#xff0c;而AudioPolicyService则是策略的制定者。这种分离方式有效地降低了整个系统的藕合性&#xff0…