一个非常奇怪的问题,需要高手!

kmzwm 2005-11-15 11:25:18
我在linux下,写了一个c++程序,使用g++进行编译,该程序调用c的一个函数,c的源代码是用gcc编译的,我用gdb调试时,发现一个很奇怪的事情:在C++的代码处,调用函数传入给被调用函数参数在被改变了!简单地说:
  extern "C" { f2(int a, int b ,int c);}
class A
{
public:
int f();
};

int A:f()
{
f2(1, 2, 3);
}

用gdb调试时,进入f2看a,b,c发现并不是传进去的1,2,3!
 这是什么原因啊!我想通常参数发生改变,可能是参数压栈顺序不同,但g++和gcc不会存这个问题!哪位高手知道!
...全文
549 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
allen_wang 2005-11-17
  • 打赏
  • 举报
回复
可能我没有表达清楚,我这句话的前提也是如果在函数开头没有那两句汇编。就会这样。
push ebp
mov ebp, esp
这样在函数中无论如何push,pop。ebp的值相对于栈内的参数,局部变量是一个不变的地址,因此,调试器对于参数,局部变量,是通过ebp +/- 一个相对值来定位的。
如果没有这两句汇编,ebp的值就不定,这时候调试器通过ebp来定位栈内的参数,变量,肯定是错误的。
wanguodu 2005-11-16
  • 打赏
  • 举报
回复
除非你提供更详细的信息,比如真正的函数原型等,否则很难分析,可能性太多了。
allen_wang 2005-11-16
  • 打赏
  • 举报
回复
你反汇编看看那个参数显示不正确的函数,开始时是否有:
push ebp
move ebp, esp
这样两条汇编语句,如果没有,一般来说,调试器是无法正确解释参数值的。
而且如果局部变量值较多(多于可用寄存器时)或者局部数组,都是无法正确取其值的。
kmzwm 2005-11-16
  • 打赏
  • 举报
回复
to allen_wang:
" 而且如果局部变量值较多(多于可用寄存器时)或者局部数组,都是无法正确取其值的。"
这是什么原因呢?
x86 2005-11-15
  • 打赏
  • 举报
回复
我试了一下,没有你说的问题。

-- a.c --
#include <stdio.h>

int f2(int a, int b, int c) {
printf("a=%d, b=%d, c=%d\n", a, b, c);
return 0;
}

-- b.cpp --
extern "C" {
int f2(int a, int b ,int c);
}

class A
{
public:
int f();
};

int A::f()
{
f2(1, 2, 3);
}

int main() {
A a;
a.f();
}
chenbinghui 2005-11-15
  • 打赏
  • 举报
回复
其他地方内存越界了吧。
snowbirdfly 2005-11-15
  • 打赏
  • 举报
回复
恩!~
是啊~
应该是int A::f()//类作用域算符写错了~~
刚才没有注意到~~
PMsg 2005-11-15
  • 打赏
  • 举报
回复
int A:f()

错了吧……

int A::f()
Mr_Yang 2005-11-15
  • 打赏
  • 举报
回复
学习。
snowbirdfly 2005-11-15
  • 打赏
  • 举报
回复
g++和gcc现在正在学,但是是刚起步~~~
也不知道它的函数参数入栈方式是不是和WINDOWS下面一样~~
kmzwm 2005-11-15
  • 打赏
  • 举报
回复
gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../../include -I../include -g3 -D__MINIGUI_LIB__ -D_REENTRANT -Wall -Wstrict-prototypes -pipe -MT dbuf.lo -MD -MP -MF .deps/dbuf.Tpo -c dbuf.c -fPIC -DPIC -o .libs/dbuf.lo
这是gcc编译其中一个文件的情况。好像也没有什么问题!

编译完成后,写了一个c++程序,用g++进行编译,没有带任何编译选项,但调试时,显示都是错误的。奇怪是程序运行并没有错误!
fine10000 2005-11-15
  • 打赏
  • 举报
回复
学习
allen_wang 2005-11-15
  • 打赏
  • 举报
回复
你的程序是这么简单的一个,还是这只是一个示例?
用调试器看的值不对,但是直接在程序里打印出来是对的么?多半是对的吧。
你的程序编译时,是不是有很多编译选项?有没有去查过每个编译选项的含义?
gcc 的编译选项formit-framepointer,就会导致编译出来的程序,调试时无法准确定位栈内的变量。
kmzwm 2005-11-15
  • 打赏
  • 举报
回复
其实,按理来讲,这种情况不应该出现!C++调用C的代码,应该不会有问题!但它确实出现了!
我想知道的是,什么情况下会出现这种情形!难道是gdb调试时,显示有问题?
x86 2005-11-15
  • 打赏
  • 举报
回复
〉 用gdb调试时,进入f2看a,b,c发现并不是传进去的1,2,3!
我是说不会存在你说的这个问题。
jixingzhong 2005-11-15
  • 打赏
  • 举报
回复
恩, 应该不会

不过没有g++ ...
没有办法自己验证下 ...
kmzwm 2005-11-15
  • 打赏
  • 举报
回复
这个例子,我没有试过!在这里,我只是为了说明问题而已!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧