在64位和32位系统上运行程序

Running a program on a 64bit and 32bit system

本文关键字:运行 程序 系统 32位 64位      更新时间:2023-10-16

一个在64位系统上完美运行的c++程序在32位系统上崩溃有什么原因吗?我在2台服务器上测试了一个程序。一个是64位,另一个是32位。该程序没有特定于位的命令。最初它在两者中都起作用,直到我修改并添加了一个结构并调用它。当第一次调用这个结构对象时,程序崩溃了。但是,如果我在崩溃前一行打印元素的值,那么值就在那里。顺便说一句,我指的是整数,没有指针或其他有趣的东西。我尝试将这些整数初始化为uint32_t,并进行这样的实验。但是遇到了死胡同。

结构类似于

struct info {
    int id1, id2;
    string test;
};
map<string, info> allInfo
vector<string> temp;
/* temp populated */
info details = {atoi(temp[0].c_str()),atoi(temp[2].c_str()),temp[3].c_str()};
allInfo[temp[1].c_str()] = details; 
/*somewhere after this it is accessed */
map<string, info>::iterator i;
/* printing the values here seems ok.. */
cout << (*i).second.id1 << endl << (*i).second.id2 << endl;
string first_id = "idOne : " + (*i).second.id1; 
string second_id = "idTwo: " + (*i).second.id2;

可能会出现多个问题,如果没有调试器,发现这些问题将是一场噩梦。

选项1:说服对服务器具有管理权限的用户安装gdb

选项2:在各处添加print语句,以准确地计算出segfault发生在便利贴上的哪一行(或者尝试自己计算)。

一个简单的原因是未定义的行为。

只是猜测。你是在64位机器上编译的吗?可能有一些操作码在32位机器中不可用。

因此,在32位构建中没有强制转换,没有动态分配和崩溃,而在64位构建中则没有。我的第一个猜测是访问他们范围之外的数组。

您正在向中的字符数组添加整数

string first_id = "idOne : " + (*i).second.id1; 
string second_id = "idTwo: " + (*i).second.id2;

可能是测试集不同,在非抛出系统上,您意外地获得了一个有效的地址来分配给字符串变量。