用GDB无法Step进去某个函数

【gdb】- 单步执行和跟踪函数调用 操作环境:[root@localhost zhangsan]# cat /proc/version Linux version 2.6.32-696.el6.x86_64 (mockbuild@c1bm.rdu2.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) ) #1 SMP Tue Mar 21 19:29:0... 阅读详情

这篇只是记录自己的不小心,下次别再犯同样的错误。

手工tags: GDB step define 宏定义


今天发现某一个函数的结果极其奇怪,正好最近在学用GDB,就用GDB调试一下。

(gdb) n
11	    amic_list_append(list, ptr);
(gdb) s
13	    printf("[%s]\n", (char *)list->first->data);

step并不能够跳进去函数中,而是直接跳出。

网上查找了一下原因,编译该函数时,若没有加上-g选项则不能跳进去。

(事后实验了下,不加-g跳不进去的现象和我这次的现象一样)

但makefile后发现,没有漏掉-g。 那么,会是什么原因呢?


自己先写了一个小的demo,在调试demo时发现可以跳进去。那说明函数没有问题,问题是出在了调用方。

可调用方的错误会在哪呢,找了半天也没有找出来,就算不能调试问题也得解决,所以就用了自己打日志的老办法。

在amic_list_append函数内部,将参数信息输出到stderr。

编译运行,该条信息根本就没有输出。也就是说,程序就没有走到这个函数里面去。

难道是没有现实这个函数? nm下函数所在的.o文件,存在amic_list_append.

.o中已经实现了该函数,但为什么调用不到这个函数呢?

这调用方这是白纸黑字的调用了amic_list_append的。

那么原因就可能是调用的函数并不是预想的函数,可能是函数重名了。

但是函数重定义的话是在编译时就会出错的啊,那如果在编译时没有重名呢?确实有可能……

可能情况1:[问题在链接时] 链接错了文件,而那个错的文件恰好有同样的函数。 

          检查后发现自己没有链接错文件。

可能情况2: [问题在预处理] 存在宏定义#define amic_list_append xxxxx, 这样在编译前就会将调用语句替换掉。

         果不其然,确实有这个宏定义在。这是昨天写了一部分的宏定义,今天重新函数实现的时候忘了删除该宏定义了。


将宏定义去掉,程序运行正常了,再用下GDB,也能正常的step了~


总结:

 宏定义要小心, 不经意的使用了宏可能会使你的程序变得很奇怪,在调试的时候也只是会显示预处理前的代码。

 发现代码走向与实际代码不一致时,可以用 gcc -E source.c 命令生成预处理后(做过宏引入,替换等)的文件.当然我一般会加上-o source.i的选项。


用gdb跟进函数但step后无效的原因有可能:     (不完全统计...)

1) 函数所在文件编译时未加 -g 选项

2) 存在宏定义与编译名相同

 




gdb:调试,程序莫名的跳动到程序的结尾; nexti的使用 假如这个宏函数里做了很多的事情,就有可能会被忽略,那能不能用step走进去呢?除非这个复杂逻辑里有其他函数调用,才能走进去,如果没有其他函数调用,step也说无用。昨天遇到一列gdb调试的问题,说,明明在程序的尾部做了一个标准输出的打印,但是使用gdb调试怎么都不能走到这一条语句。最后发现,是调试的粒度太大,不应该用next(是按C语言里的一条语句执行),而是应该用nexti:是按汇编指令一条条的调试。像这种莫名奇妙的现象,最可能学到新知识,因为只有当自己不知道此类知识的时候,才会感到莫名奇妙! 阅读详情

相关推荐

Linux 命令之 localectl -- 控制系统的本地化与键盘布局

文章目录命令介绍常用选项参考示例(一)显示当前的本地化设置与键盘映射(二)设置系统的本地化字符集环境变量(三)列出本地所有字符集(四)列出所有可用的控制台键盘映射(五)设置控制台的键盘映射 命令介绍 localectl 命令可用于查询与修改系统的本地化(locale)与键盘布局的设置。 它通过与 systemd-localed.service 通信来修改例如 /etc/locale.conf 与 /etc/vconsole.conf 之类的配置文件。本地化设置控制着 用户界面的语言、字符类型与字符编码、 日

liaowenxiong的博客 5396

gdb 调试step进不去函数内部

我的问题是在使用了有源码的库文件写应用时,包含源码路径编译,加-g参数,但gdb单步进不去库函数内部 分析发现时库文件的makefile编译时没有加-g参数,也就是说所有参与调试的源文件编译时都要加-g参数才能使用gdb调试。...

wssjn1994的博客 5813

Wafer的T7 Code是什么,怎么来的

在半导体Cim系统中,waferstart 业务需要支持 Sorter 读取 Wafer 的 T7 Code,与 MES 的 Wafer ID 进行绑定,以便向 前追溯 Wafer 历史,那么问题来了,T7code 是什么Wafer的T7 Code是一种,用于标识双面抛光的晶圆。这种标记采用二维矩阵代码符号,适用于各种尺寸的晶圆,不仅限于450mm无缺口晶圆7。T7 Code是衬底来料背面通常会有的供应商刻的追溯ID,这是一串数字和字母组成的流水码。

阿拉伯梳子的专栏 7924

Linux下gdb调试命令step命令使用

Linux下gdb调试

wojiaxiaohuang2014的博客 1939

国产麒麟系统下用Rider开发C#桌面应用:从环境配置到Avalonia UI实战

本文详细介绍了在国产麒麟系统上使用JetBrains Rider开发C#桌面应用的完整流程,重点讲解了Avalonia UI框架的实战应用。从环境配置、Rider安装到Avalonia项目创建和UI开发技巧,全面覆盖了在非Windows环境下进行C#开发的关键步骤和优化建议,助力开发者高效构建跨平台桌面应用。

weixin_27791839的博客 387

基于ADS1299的8通道脑电采集系统硬件设计实战

生物电信号采集是医疗电子与可穿戴设备中的关键环节,微弱信号的高保真放大与数字化处理直接影响系统性能。高精度模数转换器与低噪声模拟前端设计成为工程实践的核心。ADS1299作为专用生物电测量芯片,集成多通道低噪声放大器与24位Δ-Σ ADC,广泛应用于脑电、心电等生理信号检测。本文基于ADS1299构建8通道脑电采集系统,详细阐述硬件架构、电源与参考设计、输入保护、PCB布局布线、固件SPI配置及数据读取,并结合实测数据分享噪声抑制与调试经验,为EEG采集设备开发提供完整参考。

weixin_29169505的博客 224

Linux系统编程2-gdb调试和makefile

Linux系统编程中的gdb调试和makefile

zhaojiazb的博客 333

告别虚拟机!用ZYNQ7000和PYNQ 2.6.0打造一个能实时识别人脸的“智能摄像头”

本文详细介绍了如何利用Xilinx ZYNQ7000开发板和PYNQ 2.6.0框架构建实时人脸识别系统。通过硬件加速和嵌入式开发技术,该系统实现了低延迟、低功耗的独立运行能力,适用于边缘计算和物联网应用。文章包含从环境搭建到核心功能实现的完整指南,并提供了性能优化和问题排查的实用技巧。

weixin_42543046的博客 391

关于gdb调试: 你的问题可能会在这里找到答案

又叫数据断点,这样的断点其实就是前面课程中介绍的用 watch 命令添加的部分断点(watch 添加的断点有部分是通过软中断实现的,不属于硬件断点)。命令是一个强大的命令,它可以用来监视一个变量或者一段内存,当这个变量或者该内存处的值发生变化时,GDB 就会中断下来。我们需要查看地址,因为目的是要看某内存地址上的数据是怎样变化的。多个线程都调用同一个函数,当我们进入函数后进行逐行调试时,原本期望执行完第10行后往下11行执行,而此时系统有可能会切换到另外一个线程,而跳转到函数的第5行源码,造成混淆。

locahuang的博客 3167

ubuntu安装FSL

1.下载fslinstaller.py 官网下载地址:https://fsl.fmrib.ox.ac.uk/fsldownloads_registration 或者去我的百度网盘取: 链接:https://pan.baidu.com/s/1d5eHm48oamFdYdKm84nifw 提取码:6ff9 2.将base环境改成python2.0版本 本来想在服务器安装,服务器没有sudo权限,网上很多教程都装不了,于是就自己安装虚拟机再装了一个ubuntu,然后安装了python2环境,再开始装fsl,fsl

qq_36421001的博客 4098

MPU6050数据融合避坑指南:当欧拉角遇到万向节死锁,我们该如何处理?

本文深入探讨了MPU6050在姿态解算中遇到的欧拉角万向节死锁问题,提供了四元数解决方案及工程实践策略。通过分析死锁现象的本质,介绍四元数的优势与实现方法,并给出必须使用欧拉角时的三种应对方案,帮助开发者有效规避数据跳变和解算失效问题。

weixin_30415113的博客 541

GDB 使用详解-----转载

很优秀的文章但不知哪位大神所写,多谢这位大神! 一、初始化输入gdb进入gdb调试环境。或者直接输入gdb + progfile来加载文件。注意该文件是使用gcc(或g++)编译得到的。为了使 gdb 正常工作, 必须使你的程序在编译时包含调试信息,编译时必须使用-g参数来。或者进入gdb环境后,通过命令file + progfile来加载需要调试的可...

weixin_34194551的博客 677

基于 parallels ubuntu 20.04 LTS (focal) 的ros+px4+gazebo 安装

基于 parallels ubuntu 20.04 LTS (focal) 的ros+px4+gazebo 安装。

weixin_40132006的博客 2241

gdb无法断点一例问题的解决

最近在做代码编译迁移的时候,遇到一例,用dlopen打开动态库然后无法step进入动态库函数的问题。 最后,注意到gdb的一行调试信息:warning: Could not load shared library symbols for xxxx. 查看测试代码,发现其中使用cddir切换工作目录并加载相对目录的动态库。 将相对目录改为绝对目录后问题解决。 我猜测gdb加载symbol的...

weixin_30883271的博客 442

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

使用GDB调试RB-tree的几个问题(更正)

本博客http://blog.youkuaiyun.com/livelylittlefish 贴出作者(三二一@小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正! Content 1. at后面的一堆字符串代表什么? 2. 为什么没有单步进入(step in)_Rb_tree_insert_and_rebalance函数? 3. 如何通过目标文件.o或者可执行文件得知是否有debugging information? 4. 如何单步调试没有debugging information的函数? 0. 引子

学习,思考,记录,分享。 3429

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

使用GDB调试C库

用gdb调试程序时,一般的函数都可以step进去,可是C库函数却直接跳过了。 网上找了些资料,记录一下! 1.安装C库的debug版本 sudo apt-get install libc6-dbg 安装完后,在/usr/lib目录下会多出一个debug目录,里面有安装的debug版c库的动态链接文件 2.编译程序,使用debug版本C库 例如程序test.c,使用如下命令编译。

astrotycoon 6216

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

gdb调试程序时跳进函数和跳出函数

说实话平时在Windows平台上开发,gdb调试用的并不是很多,但是一些在linux平台才会出现的BUG,或者在linux运行时宕机产生了core文件,这些还是需要使用gdb调试的,之前的文章《linux环境下服务器程序的查看与gdb调试》列举了常用的gdb命令,基本上调试一些core文件和简单bug使用这些命令足以了,但是新的需求总是会出现...

AlbertS Home of Technology 4万+

[Linux] gdb 单步执行和跟踪函数调用

一、前言 在写程序时,不能保证程序总是正确的,特别是运行时出错的情况。在 Linux 中提供了一个很强大的调试工具 gdb ,可以完全操控程序的运行,能够随时查看程序中所有的内部状态,比如各变量的值、传给函数的参数、 当前执行的代码行等。 无论是否有这样的调试工具,调试的基本思想仍然是 分析现象->假设错误原因->产生新的现象去验证假设 的循环,根据现象来假设错误原因,以及如何设计新的...

shiawaseli的博客 7323

gdb 进入函数内部_GDB单步调试程序

《调用GDB调试器的几种方式》一节中提到,借助 next 命令可以控制 GDB 单步执行程序。所谓单步调试,就是通过一行一行的执行程序,观察整个程序的执行流程,进而尝试发现一些存在的异常或者 Bug。根据实际场景的需要,GDB 调试器共提供了 3 种可实现单步调试程序的方法,即使用 next、step 和 until 命令。换句话说,这 3 个命令都可以控制 GDB 调试器每次仅执行 1...

weixin_42295528的博客 6133

gdb 笔记(09)— 常用命令示例说明(run、continue、next、step、until、finish、return、jump、print、backtrace、frame、thread等)

gdb 常用命令列表

wohu1104的专栏 8037

GDB step by step

gdb

fs交流的博客 184

linux进阶19——GDB(五):单步调试命令(next、step和until)

一段c语言程序: #include <stdio.h> int print(int num){ int ret = num * num; return ret; } int myfunc(int num){ int i = 1; int sum = 0; while(i <= num){ sum += print(i); i++; } return sum; } int main(){ in

www_dong的博客 2万+

GDB Tutorial (GDB 调试教程)

GDB Tutorial (GDB 调试教程)

程永强 907

linux gdb 跳出函数,gdb调试程序时跳进函数和跳出函数

文章目录前言测试代码代码编译step/finish组合step/return组合总结前言说实话平时在Windows平台上开发,gdb调试用的并不是很多,但是一些在linux平台才会出现的BUG,或者在linux运行时宕机产生了core文件,这些还是需要使用gdb调试的,之前的文章《linux环境下服务器程序的查看与gdb调试》列举了常用的gdb命令,基本上调试一些core文件和简单bug使用这些命...

weixin_35197990的博客 1957

GDB的使用

linux下gdb的用法

weixin_58165485的博客 8043

Linux下gdb调试用法

稍微小小介绍一下 gdb是GUN组织开发的Linux下的调试利器。一般用于调试C/C++程序。 GDB主要有以下4个功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。下 直接进入主题 这是本次用来测试的代码 #includ...

weixin_62017112的博客 9554
上一篇: 本地CVS环境搭建
下一篇: 删除tar包解压文件
soooooot
博客等级 码龄19年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值