存档

‘跟踪调试’ 分类的存档

Linux下GTK界面调试

2013年6月8日 没有评论 5,925 次浏览

初学GTK,各种不懂,问题多多,遇到的第一个值得记录一下的问题就是在Linux下对GTK界面的调试问题。之前Linux下的各种操作从未考虑图形界面的问题,而全在终端下进行,使用gdb或cgdb是各种顺畅。现在在ubuntu图形系统Unity下调试GTK程序,竟然发现出现卡死的情况。 具体情况是这样,目前我正在做Linux下输入法的开发,暂选定的输入法为fcitx,在Unity的伪终端里用gdb启动fcitx,在TrayWindowInit处下断点,执行r运行程序,断下来后,整个X... [阅读更多]

独立的调试符号文件

2013年4月29日 没有评论 4,525 次浏览

也许,我们还记得各大Linux发型版提供的debuginfo安装包,比如fedora:http://fedoraproject.org/wiki/Packaging:Debuginfo,这种将可执行程序与调试符号分离的方案好处多多。一方面,缩减了可执行程序的文件大小,在一定程度上提高了程序的执行性能,另一方面,对应的调试符号文件也方便了一些不时之需。本文就来看一下与此相关的两个问题。 一,如何给应用程序创建对应的调试符号文件? 这很简单,看个演示实例。有代码如下: #... [阅读更多]

分类: *nix技术, 跟踪调试 标签: ,

死锁检测模块lockdep简介

2013年4月10日 没有评论 10,045 次浏览

在Linux系统里,假设有两处代码(比如不同线程的两个函数F1和F2)都要获取两个锁(分别为L1和L2),如果F1持有L1后再去获取L2,而此时恰好由F2持有L2且它也正在尝试获取L1,那么此时就是处于死锁的状态,这是一个最简单的死锁例子,也即所谓的AB-BA死锁。 死锁导致的最终结果无需多说,关于如何避免死锁在教科书上也有提到(参考1),最简单直观的做法就是按顺序上锁,以破坏死锁的环形等待条件。但对于拥有成千上万个锁的整个系统来说,完全定义它们之间的顺序是非常困难的,所以一种更可行的办法就是尽量提前发现这其中潜在的死锁风险,而不是等到最后真正出现死锁时给用户带来切实的困惑。 已有很多工具用于发现可能的死锁风险,而本文介绍的调试/检测模块lockdep,即是属于这一类工具的一种。调试模块lockdep从2006年(https://lwn.net/Articles/185666/)引入内核,经过实践验证,其对提前发现死锁起到了巨大的效果(http://lwn.net/Articles/321670/)。 官方文档(完全参考2)有介绍调试模块lockdep的设计原理,这里按照我自己的理解描述一下。 一,lockdep操作的基本单元并非单个的锁实例,而是锁类(lock-class)。比如,struct... [阅读更多]

如何对仅在指定调用路径下的函数断下断点

2013年3月16日 没有评论 3,012 次浏览

举个例子,有示例代码如下: # cat t.c #include <stdio.h> void foo() { printf("foo\n"); } void bar() { foo(); } void baz() { foo(); } int main() { bar(); baz(); bar(); ... [阅读更多]

Linux Kprobes介绍

2013年3月10日 1 条评论 4,499 次浏览

不得不说printk()函数是一个伟大的调试工具,它几乎能帮助我们在Linux系统的任何位置把我们想要的数据打印出来,但同时这也是一个比较耗时的过程,因为我们得把printk()函数加入到Linux内核源码的对应位置,重新编译模块,如果是内核修改,那么也许还得重启机器。 动态工具Kprobe的出现,使得我们可以在Linux系统的大部分地方都能通过更简便、快速的方法获得更多的内核信息,在前面文章里曾介绍的SystemTap也就是以Kprobe为基石而成的用户命令接口。 Kprobe,简单点说就是允许我们在内核执行到指定的地方时回调一个我们的自定义函数,在这个自定义函数内,我们就可以执行一些内核信息(类似于以前的printk())收集动作,完了之后内核再回去执行它原本的逻辑。 在这里,“内核执行到指定的地方”有一个专门的术语叫做probe(探针),目前有三种类型的probe,分别为: kprobes:内核代码的任何指令处。 jprobes:内核函数的入口处,因此可以很方便的获取到对应内核函数的参数。 kretprobes:内核函数的退出点。 先看个Kprobe实例: /* ... [阅读更多]

如何禁止Linux内核的-O2编译选项

2013年3月10日 2 条评论 6,354 次浏览

已有各种工具可以帮助我们调试内核,比如UML、kgdb、qemu等,但比较麻烦的是gdb经常给我一个“value optimized... [阅读更多]

使用systemtap调试Linux内核

2013年2月24日 1 条评论 5,002 次浏览

最近在公司看Linux内核的nmi死锁检测功能的实现机制,当然,是因为它变了,所以我才看的,简单来说就是在红帽的某牛提交了一个内核patch:new nmi_watchdog using perf... [阅读更多]

关于ELF的辅助向量

2013年2月5日 没有评论 3,197 次浏览

elf是Linux系统下最通用的可执行程序的文件格式,关于elf文件的加载与动态链接已很多的相关资料,而本文尝试着重介绍一下其中的一个点,即辅助向量(Auxiliary... [阅读更多]

如何追踪函数的完整调用过程

2013年2月5日 2 条评论 5,583 次浏览

何追踪函数的完整调用过程?对于软件编程人员来说,这一个有趣的话题,而在stackoverflow上就恰好有这么一个讨论,本文就对这个讨论里的内容进行一下实际操作与转述。 我们知道两个命令,ltrace和strace,其中ltrace用于追踪记录动态库函数的调用执行,而strace用于追踪记录系统调用函数的调用执行,看示例: #... [阅读更多]

64位Linux下的系统调用

2013年2月4日 没有评论 4,631 次浏览

AMD64,由AMD公司提出来的64位技术,由于它能很好的向下兼容32位,因此在与Intel公司的纯64技术IA64(即无法向下兼容)进行竞争的过程中占据着绝对的市场优势,当然,Intel公司不会自甘落后,因此也相继推出了IA32E(后被正式命名为EM64T,Extended... [阅读更多]