printf 地址_记64位地址截断引发的挂死问题

文章介绍了在将32位程序转换为64位过程中遇到的挂死问题,原因是函数返回的64位地址在32位程序中被截断为32位,导致非法内存访问。通过示例代码和分析,指出了解决此类问题的方法,包括在函数使用前进行声明,避免类型不匹配导致的地址截断。
摘要由CSDN通过智能技术生成
作者: 守望,Linux应用开发者,目前在公众号【编程珠玑】 分享Linux/C/C++/数据结构与算法/工具等原创技术文章和学习资源

前言

最近要将整个项目的代码从原先的只支持32位变成同时支持32位和64位,这个过程中遇到一个很不容易定位的挂死问题,花了不少时间才定位解决,因此分享给大家。

32位和64位代码区别

在分享之前,需要了解一下32位和64位程序代码有何区别,它的主要区别体现在某些数据类型的占用字节大小的不同:

数据类型 32位 64位
long 4字节 8字节
unsigned long 4字节 8字节
指针 4字节 8字节
size_t 4字节 8字节
ssize_t 4字节 8字节

这些是主要的差别。

那么为什么要切64位呢?原因也很简单,32位寻址范围有限,能使用的最大内存也是非常有限的,因此需要使其能够支持64位,这个过程需要修改编译工程,编译第三方库为64位,修改代码等等。当然这些都不是本文的重点,本文仅介绍遇到的这个典型的问题。

问题描述

由于项目本身涉及的系统比较复杂,因此简单分享一下定位过程,下一节将通过简洁的示例程序来说明。

问题现象:向服务器发送一条操作指令后直接挂死

分析解决过程简化为如下步骤:

  • 查看日志以及coredump信息,初步定位挂死的位置

  • 发现挂死在停止定时器的位置

  • 32位程序正常,而64位异常,因此和32位与64位的差别有关

  • 怀疑传入定时器数据有问题,编写小demo,排除传入数据问题

  • 编译可调试版本,加入-g参数

  • 跟踪调试,发现最终挂在了一个动态库中

  • 设置gdb源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值