热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux命令之调试工具gdb

转自:http:blog.csdn.netzdl1016articledetails6359024强烈推荐参考文档:.新浪电子书有下载.编译生成带调

转自:http://blog.csdn.net/zdl1016/article/details/6359024

强烈推荐参考文档: . 新浪电子书有下载.


编译生成带调试信息的可执行文件,

gcc -g tst.c -o tst // 使用-g选项

 

所谓的带调试信息指的是: 把每一条执行汇编语句对应的源码的文件名以及所在的行号记录下来. 并不记录源代码内容本身.

 

gdb的常用命令:

l/list  // 列出第n行代码附近(上下文)的源码

l // 接着上一行往下显示源码

l - // 接着上一行往上显示源码

break 3 // 在第三行打上断线

break tst.c:28 // 指定在tst.c文件的第3行上打断点

break tst.c:func // 在指定文件的指定函数上打断点 =====>有用

clear 3 // 取消在第三行上打的断点

info break // 查看所有的断点标记 ======>有用

disable 3 // 禁用info显示出的编号为3的断点 ======>有用

r/run // 运行程序, run的简写

n/next // 单条语句执行, next的简写  如果遇到函数, 不会进入

s/step // 单步跟踪, 如果有函数, 会进入函数

(gdb) s

10      in tst.c // 执行完一步后, 下一次将要执行的代码行:位于tst.c文件的第10行(还没执行)

 

finish // 跳出当前函数, 并打印当前函数的返回结构

c/continue // 继续执行程序, 直到遇到下一个断点, continue的简写, 

p i // 打印变量i的值 查看局部堆栈上的变量值

p *vec2@5 // 打印已vec2为首地址的内存中,  往后的5个元素, 每个元素长度为根据首地址类型而定, 如果是char*, 则1个字节长

               如果vec2是int*, 则每个元素长度为4

举例 char* vec2 = xxx; 其中的各个元素内容为: 

            'a' 'b' 2 'd' 5 0 0 0 0 0 查看就是

"ab/002d/000/005/000/000/000"

数字按照 /xxx显示

 

bt // 查看函数调用堆栈

bt  // 只打印堆栈里面最新的n个frame

bt <-n> // 只打印堆栈里面最老的n个frame

q // 退出gdb

frame 3 // 查看堆栈上的某一个frame, 只有先切换到该frame, 才能查看该frame上的局部变量

info local // 查看当前frame里面全部的局部变量

info args // 查看当前frame的参数的全部入参的值

info frame // 查看当前frame的总体参数情况, (没什么用)

 

dir dirname // 设置搜索源代码的路径,多个路径已:分割 &#61;&#61;&#61;&#61;&#61;&#61;&#61;>非常有用!!!

show directories // 查询当前使用的搜索源代码的路径

 

查看源代码和汇编代码的对应

 disassemble main // 查看main函数对应的汇编代码

info line tst.c: // n为行号, 查看文件的第n行对应的汇编代码地址

info line tst.c:func // func为函数名称, 查看文件中的func函数对应的汇编代码地址

 

如何attach到一个已经在运行的进程

gdb -p pid // 直接attach到某个进程, 该进程自动暂停, 可以使用c 使之继续执行

 

通过continue命令让程序跑起来之后, 如何再次中断程序执行?

ctrl&#43;c

 

如何调试一个core文件?

假设 core文件是有 a.out文件产生的, 那么:

gdb a.out core

 

 

如何找到和可执行程序匹配的源文件代码?

假设可执行文件和源代码的路径关系如下:

     gdb_test/a/可执行程序

     gdb_test/b/源文件

 

方法1:

通过dir 设置搜索源代码的路径, 多个路径已:分割

dir gdb_test/b 即可. 会自动把gdb_test/b加到已有的搜索路径里面, 不会影响原有的路径. 可以通过show directories查看.

 

方法2:(不推荐)

切换gdb的工作路径到源代码所在的文件

1) 进入gdb

2) pwd 查看当前工作路径

3) 通过 cd 命令 把当前工作路径切换到源代码所在的路径下(eg:gdb_test/b/)下

 

当源文件有更新时(和可执行文件不匹配时), gdb会提示

warning: Source file is more recent than executable.

 

程序崩溃时是否产生了core文件? 

方法1:

ulimit -a, 如果core file size     为0, 则不产生core文件. 通过 ulimit -c unlimited使之产生

 

方法2:写一个可以崩掉的程序实验一把 如果提示(core dumped),则有.

eg:

nemo&#64;vm04_sles10:a$ ./a.out 

Segmentation fault &#61;&#61;&#61;&#61;&#61;&#61;&#61;

nemo&#64;vm04_sles10:a$ ./a.out 

Segmentation fault (core dumped) &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;

 

若产生了core文件, core文件的存放路径和文件名是什么样的?

cat /proc/sys/kernel/core_pattern 根据core_pattern的值不同而不同

如果值为 core:

 系统会在程序当前目录,产生名为core的文件. 这根系统设置有关

如果值为 /corefile/core-%e-%p-%t

 存放路径为 /corefile/ 文件名为: 文件名为core-命令名-pid-时间戳



推荐阅读
  • C语言是计算机科学和编程领域的基石,许多初学者在学习过程中会感到困惑。本文将详细介绍C语言的基本概念、关键语法和实用示例,帮助你快速上手C语言。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 本文介绍了如何在Linux和Windows环境中使用C语言中的beep函数来生成不同频率的声音,并提供了详细的代码示例和解释。 ... [详细]
  • centos 7.0 lnmp成功安装过程(很乱)
    下载nginx[rootlocalhostsrc]#wgethttp:nginx.orgdownloadnginx-1.7.9.tar.gz--2015-01-2412:55:2 ... [详细]
  • 在C语言程序开发中,调试和错误分析是确保代码正确性和效率的关键步骤。本文通过一个简单的递归函数示例,详细介绍了如何编写和调试C语言程序。具体而言,我们将创建一个名为 `factorial.c` 的文件,实现计算阶乘的功能,并通过逐步调试来分析和解决可能出现的错误。此外,文章还探讨了常见的调试工具和技术,如GDB和断点设置,以帮助开发者高效地定位和修复问题。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 如何利用正则表达式(regexp)实现高效的模式匹配?本文探讨了正则表达式在编程中的应用,并分析了一个示例程序中存在的问题。通过具体的代码示例,指出该程序在定义和使用正则表达式时的不当之处,旨在帮助读者更好地理解和应用正则表达式技术。 ... [详细]
  • GDB 使用心得与技巧总结
    在使用 GDB 进行调试时,可以采用以下技巧提升效率:1. 通过设置 `set print pretty on` 来美化打印输出,使数据结构更加易读;2. 掌握常见数据结构的打印方法,如链表、树等;3. 利用 `info locals` 命令查看当前作用域内的所有局部变量;4. 在需要进行类型强制转换时,正确使用语法,例如 `p (Test::A *) pObj`。这些技巧能够显著提高调试的便捷性和准确性。 ... [详细]
  • 我自己做了一个网站图片的抓取,感觉速度有点慢抓取4000张图片可能得用15分钟左右的时间,我百度看用线程可以加快抓取,然后创建了5个线程抓取,但是5个线程是同步执行同样的操作一个图片就 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
author-avatar
唲戲2502873263
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有