当前位置: 技术问答>linux和unix
Linux 64下调试程序遇到的相当诡异的问题(高手进)
来源: 互联网 发布时间:2017-04-23
本文导语: 最近在Linux下编译一个程序,CentOS 32位编译通过,运行功能正常;在CentOS 64位下编译通过,但运行功能总是出错。 我用GDB跟踪了一下代码,发现一个诡异的、百思不得其解的问题:结构体参数在函数的调用过程中,...
最近在Linux下编译一个程序,CentOS 32位编译通过,运行功能正常;在CentOS 64位下编译通过,但运行功能总是出错。
我用GDB跟踪了一下代码,发现一个诡异的、百思不得其解的问题:结构体参数在函数的调用过程中,悄无声息的发生了变化,而这个结构体参数只是被函数作为实参来传递,函数内部没有对结构体进行修改。
大致流程如下:
void cpi_query_binary(char *name, char *db)调用了函数ii_query_init(&envHandle),这个函数的大致实现如下:
void ii_query_init(II_PTR *envHandle)
{
...
II_INIT parmInit;
parmInit.version = 2;
parmInit.timeout = -1;
ii_initialize(&parmInit);
...
}
函数void ii_query_init(II_PTR *envHandle)又调用了ii_initialize(&parmInit),将结构体参数II_INIT parmInit赋值后传递给了ii_initialize(&parmInit)。
ii_initialize(&parmInit)的实现如下:
II_EXTERN II_VOID II_FAR II_EXPORT ii_initialize(II_INIT II_FAR *init_parm)
{
//进入函数后,用gdb指令打印init_parm,发现parmInit.version的值是-1,而不是先前的2。
//ii_initialize(&parmInit)又调用IIapi_intialize(init_parm),将错误的信息传给了内核,造成程序功能不正常
IIapi_intialize(init_parm);
}
上面这种情况只在Linux 64位下存在。同样的代码,我在Linux 32位下运行,功能完全正常。
不知道是什么原因造成了上面的问题?
我用GDB跟踪了一下代码,发现一个诡异的、百思不得其解的问题:结构体参数在函数的调用过程中,悄无声息的发生了变化,而这个结构体参数只是被函数作为实参来传递,函数内部没有对结构体进行修改。
大致流程如下:
void cpi_query_binary(char *name, char *db)调用了函数ii_query_init(&envHandle),这个函数的大致实现如下:
void ii_query_init(II_PTR *envHandle)
{
...
II_INIT parmInit;
parmInit.version = 2;
parmInit.timeout = -1;
ii_initialize(&parmInit);
...
}
函数void ii_query_init(II_PTR *envHandle)又调用了ii_initialize(&parmInit),将结构体参数II_INIT parmInit赋值后传递给了ii_initialize(&parmInit)。
ii_initialize(&parmInit)的实现如下:
II_EXTERN II_VOID II_FAR II_EXPORT ii_initialize(II_INIT II_FAR *init_parm)
{
//进入函数后,用gdb指令打印init_parm,发现parmInit.version的值是-1,而不是先前的2。
//ii_initialize(&parmInit)又调用IIapi_intialize(init_parm),将错误的信息传给了内核,造成程序功能不正常
IIapi_intialize(init_parm);
}
上面这种情况只在Linux 64位下存在。同样的代码,我在Linux 32位下运行,功能完全正常。
不知道是什么原因造成了上面的问题?
|
很可能是你传递过程中,参数结构体的名字不同或者结构体内部数据类型不完全对应导致。