文档章节

运行时调试-关于死循环

a
 alex_wei
发布于 2013/07/01 17:43
字数 626
阅读 564
收藏 0
点赞 0
评论 0
对于正在运行的程序,使用gdb attach功能进行运行时调试(启动gdb后使用attach <PID>命令或在启动gdb时使用-p <PID>参数)。
以下是一段故意构造的简单死循环程序:
#include <stdio.h>
#include <unistd.h>
int main()
{
    int i;
    for (i = 0; ; ++i) {
        printf("%d\n", i);
        sleep(1);
    }
}

使用gcc -O2编译程序后运行,并在另一个虚拟终端里使用gdb attach进程:

root@bt:~# gdb -q -p 2569
Attaching to process 2569
Reading symbols from /root/test3...(no debugging symbols found)...done.
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
0x00007fbf605ac380 in nanosleep () from /lib/libc.so.6
(gdb) bt
#0 0x00007fbf605ac380 in nanosleep () from /lib/libc.so.6
#1 0x00007fbf605ac210 in sleep () from /lib/libc.so.6
#2 0x00000000004005c8 in main ()
(gdb) finish
Run till exit from #0 0x00007fbf605ac380 in nanosleep () from /lib/libc.so.6
0x00007fbf605ac210 in sleep () from /lib/libc.so.6
(gdb) finish
Run till exit from #0 0x00007fbf605ac210 in sleep () from /lib/libc.so.6
0x00000000004005c8 in main ()
(gdb) ni
0x00000000004005a8 in main ()
(gdb)
0x00000000004005aa in main ()
(gdb)
0x00000000004005af in main ()
(gdb)
0x00000000004005b4 in main ()
(gdb)
0x00000000004005b6 in main ()
(gdb)
0x00000000004005b9 in main ()
(gdb)
0x00000000004005be in main ()
(gdb)
0x00000000004005c3 in main ()
(gdb)
0x00000000004005c8 in main ()
(gdb)
0x00000000004005a8 in main ()
(gdb)
0x00000000004005aa in main ()
...
attach会使进程挂起,现象类似于插入了一个临时断点。上面的操作中使用了两次finish命令使程序运行至返回到main()函数中。

对于使用-O2选项编译的程序,无法简单的进行源代码级别的调试,next/step命令不可用。对于此类程序,可以使用nexti/stepi命令,它们大体与next/step相同,分别表示步过与步入,不同之处在于前者针对单条汇编指令。上述示例中连续使用ni(nexti)命令,从指令地址(rip寄存器值)可以比较容易的发现死循环,指令地址始终徘徊在0x00000000004005a8-0x00000000004005c8。

这一招数对于后台daemon程序相当有效。我曾经维护过一个带有守护进程的deamon程序,对于出现问题的运行中子进程,守护进程会将其杀死重启,但并不会记录详细原因。一日,某版本频繁重启,领导下了死命令:必须在XXX之前解决!于是动用重量级上古神器gdb挂上守护进程,让运行中子进程自生自灭。。。天可怜见,终于在一周后重现了问题,并使用上述方法确认了死循环问题及其位置。。。

那晚我梦见了花团锦簇。。。

© 著作权归作者所有

共有 人打赏支持
a
粉丝 2
博文 6
码字总数 2777
作品 0
海淀
程序员
Linux 下段错误产生的原因

用C写了一个小程序,运行时前面部分正常,之后出现段错误提示,网上查了一下资料,明白了原因。 产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其...

曾赛
2009/11/21
0
0
Android 调试器爆漏洞,可获取设备内存数据

本月中旬,谷歌推出了针对查找安卓系统漏洞的“安卓安全奖励”计划,发现一次漏洞最少可获500美元奖励。不过半月,真的有人发现了安卓系统漏洞。趋势科技(Trend Micro)近日发现了存在于Andro...

oschina
2015/06/30
2.6K
7
Android中为什么主线程不会因为Looper.loop()里的死循环卡死?

在知乎上的问题,觉得很好,就转载过来记录一下。 Android程序的运行入口是android.app.ActivityThread类的main()方法。(android-23) 而根据Looper.loop()源码可知里面是一个死循环在遍历消息...

xingjm8511
2016/06/12
114
0
关于 for 循环和 while 循环?

下列关于for循环和while循环的说法中哪个是正确的(  ) A while循环能实现的操作,for循环也都能实现 B while循环判断条件一般是程序结果,for循环判断条件一般是非程序结果 C 两种循环任何...

举个_栗子
2017/12/19
0
0
RunLoop运行循环 和 RunTime运行时消息机制的介绍和使用

一.Runloop —运行循环 1)用来干嘛的? 是一个死循环,保证程序不退出。程序默认一个线程执行一个任务,执行完任务后该线程就over掉了,但主线程不行,主线程一over掉程序就没有了。主线程没...

如若初见
2016/04/08
113
0
关于 80x86保护模式和编程,有看过《linux完全剖析》的么?

最近是在研读赵炯的《linux完全剖析》,学习操作系统原理。这两天已经进行到进程部分,为了更透彻地理解其原理,自己照着书上的linux0.00源 码写了一个单进程的模型。前面还好,当由特权级0...

Fuz
2012/06/04
380
1
有哪些好笑的关于程序员的笑话?(1)

据说,这些段子够你笑一年了。哈哈哈,快搬个小板凳坐好,小慕要开车了, 哦不,要讲段子了~ 前方高能预警,多图多视频,手机党慎点,土豪请随意~ 全异步算法,碉堡了 程序员爱情观:爱情就是...

小慕偶
01/08
0
0
Hibernate与Jackson

当有一对多,多对一等关联关系时,用Hibernate查询并以Jackson转成Json 比如持久化类User public class User implements java.io.Serializable{ private string id; private Set usertorole...

lreach
2016/10/28
0
0
2018-6-19bash编程之循环

我们继续将bash脚本编程,回顾一下程序的执行流程,分别为: 顺序执行选择执行循环执行 而对于循环执行来说,其分类涉及到以下几种: for, while, until 每个循环都有执行条件和退出条件,这...

谁猜谁知道
06/19
0
0
[转]使用GDB调试PHP代码,解决PHP代码死循环

最近在帮同事解决Swoole Server问题时,发现有1个worker进程一直处于R的状态,而且CPU耗时非常高。初步断定是PHP代码中发生死循环。 下面通过一段代码展示如何解决PHP死循环问题。 #dead_lo...

吾爱
2016/11/09
40
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

与女儿谈商业模式 (5):糖果连锁店?

分类:与女儿谈商业模式 2007-08-02 15:27阅读(8394)评论(32)   与女儿谈商业模式(5):糖果连锁店?   陈志武 /文   谈过星巴克、沃尔玛、戴尔以及微软的故事后,给陈笛印象最深的莫...

祖冲之
1分钟前
0
0
Linux平台下RMAN异机恢复总结

潇湘隐者 Linux平台下RMAN异机恢复总结 2017-05-29 16:30 by 潇湘隐者, ... 阅读, ... 评论, 收藏, 编辑 下面总结、整理一下RMAN异机恢复这方面的知识点,这篇笔记在个人笔记里面躺了几年了,...

rootliu
9分钟前
0
0
Spring配置xml启动报错 Connot find 'beans'

1.我们先看一下spring的原始配置 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSc......

江湖鱼大虾
11分钟前
0
0
www.w3.org被qiang导致logback报错:Connect reset

web项目部署到tomcat后,web项目中的logback不能运行,报错信息如下: Reported exception: ch.qos.logback.core.joran.spi.JoranException: I/O error occurred while parsing xml file......

浮躁的码农
34分钟前
0
0
JDeveloper中文乱码解决

全局设置字体; 全局设置环境编码; 项目设置编译器环境编码。

wffger
今天
2
0
MySQL主从介绍 , 准备工作,配置主,配置从, 测试主从同步

MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的 MySQL主从是基于binlog的,主上须开启bin...

TaoXu
今天
2
0
线性代数学习总结

亭子happy
今天
1
0
Java8:Lambda表达式增强版Comparator和排序

1、概述 在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式——特别是怎样使用它来编写Comparator和对集合(Collection)进行排序。 这篇文章是...

孟飞阳
今天
0
0
从架构到组件,深挖istio如何连接、管理和保护微服务2.0?

近几年我一直从事于微服务系统的设计以及实现方面的工作,属于微服务架构一线实践者。之前做过一些单体系统的微服务改造,在微服务拆分、治理等方面都有一定的经验。 本人比较特殊一点的经历...

xiaomin0322
今天
1
0
基于vue的h5文件切片上传(获取文件md5,实现秒传、进度条实现)

template <button @click="file"></button><label ref="upload" style="position: relative;"> <input type="file" @change="selectFile" style="position: abs......

hkaikai
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部