程序非法操作,查看堆栈,发现出错在 add $0x10,%esp(100分)

SpriteLW 2008-06-02 11:18:54
请问这句是什么意思?

具体的代码如下:
804835c: 29 c4 sub %eax,%esp
804835e: 83 ec 0c sub $0xc,%esp
8048361: 6a 01 push $0x1
8048363: e8 dc ff ff ff call 8048344 <_Z3funi>
8048368: 83 c4 10 add $0x10,%esp
804836b: 85 c0 test %eax,%eax

是不是堆栈被破坏了?
...全文
497 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
SpriteLW 2008-06-04
  • 打赏
  • 举报
回复
你看错地方了吧,应该是看0x40073f
充电宝111 2008-06-02
  • 打赏
  • 举报
回复
对啊,光给这些代码不能判断对错的
仅从这些代码看没啥问题
8048368: 83 c4 10 add $0x10,%esp
是处理堆栈指针的,一般都是调用者处理,这没问题
8048363: e8 dc ff ff ff call 8048344 <_Z3funi>
这个函数的代码要贴出来
baihacker 2008-06-02
  • 打赏
  • 举报
回复
上代码...
独孤过儿 2008-06-02
  • 打赏
  • 举报
回复
信息太少了,C代码保密,不能贴出来吗?
独孤过儿 2008-06-02
  • 打赏
  • 举报
回复
俺投降了,不知道问题出在哪里,帧栈看着看着就丢了...

等待高人吧
独孤过儿 2008-06-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 baihacker 的回复:]
你的调试时间达到15分钟了...
[/Quote]
......
独孤过儿 2008-06-02
  • 打赏
  • 举报
回复
貌似执行到这里的时候,执行了HLT指令core掉了...

Disassembly of section .text:

00000000004004f0 <_start>:
4004f0: 31 ed xor %ebp,%ebp
4004f2: 49 89 d1 mov %rdx,%r9
4004f5: 5e pop %rsi
4004f6: 48 89 e2 mov %rsp,%rdx
4004f9: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp
4004fd: 50 push %rax
4004fe: 54 push %rsp
4004ff: 49 c7 c0 50 07 40 00 mov $0x400750,%r8
400506: 48 c7 c1 60 07 40 00 mov $0x400760,%rcx
40050d: 48 c7 c7 d9 06 40 00 mov $0x4006d9,%rdi
400514: e8 8f ff ff ff callq 4004a8 <__libc_start_main@plt>
400519: f4 hlt
40051a: 90 nop
40051b: 90 nop
baihacker 2008-06-02
  • 打赏
  • 举报
回复
你的调试时间达到15分钟了...
独孤过儿 2008-06-02
  • 打赏
  • 举报
回复
先贴个我看到的错误上来:

[root@localhost stack]# gcc -o fun fun.c
[root@localhost stack]# ./fun
stack 0: ./fun [0x40063b]
stack 1: /lib64/libc.so.6 [0x38e3c300a0]
stack 2: ./fun [0x4006b5]
stack 3: ./fun [0x4006d7]
stack 4: ./fun [0x40073f]
stack 5: /lib64/libc.so.6(__libc_start_main+0xf4) [0x38e3c1d8a4]
stack 6: ./fun [0x400519]
Segmentation fault

独孤过儿 2008-06-02
  • 打赏
  • 举报
回复
写别结贴啊,我在调呢...
SpriteLW 2008-06-02
  • 打赏
  • 举报
回复
经实践,造成这个错误不一定是数组越界,也有可能是通空指针附值.

测试代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/file.h>
#include <signal.h>
#include <execinfo.h>
#include <errno.h>
#include <string.h>

int g_run = 1;
void signal_handler(int sig)
{
switch(sig)
{
case SIGTERM:
{
//WRITELOG(DebugLog,"[main] receive signal SIGTERM and stop the VPN server");
signal(SIGSEGV, SIG_DFL);

}
break;
case SIGSEGV:
{
static int nTimes=0;
nTimes++;

if(nTimes==1)
{

//log the stack information
void * array[25];
int nSize = backtrace(array, 25);
char ** symbols = backtrace_symbols(array, nSize);
for(int i = 0; i<nSize; i++)
{
printf("stack %d: %s\r\n",i,symbols[i]);

}
free(symbols);
}
signal(SIGSEGV, SIG_DFL);
}
break;
default:
break;
}
}

int fun(int aa)
{
int *paa=0;
*paa = 0;
//memcpy(paa,"ddf",3);
//int bb = 1;
//int *pRet = &bb+1;
//*pRet = 90;
return 2;
}

int fun2(int bb)
{
return fun(0);
}

int main(int argc,char *argv[])
{
signal(SIGCHLD, SIG_IGN);
signal(SIGSTOP, SIG_IGN);
signal(SIGPIPE,SIG_IGN);
signal(SIGTERM, signal_handler);
signal(SIGSEGV, signal_handler);

while(g_run)
fun2(3);

return 1;
}
过去的我 2008-06-02
  • 打赏
  • 举报
回复
c调用本来就应该是调用者自己恢复堆栈的,也就是 add $0x10,%esp 这句,
为什么会出错估计就是esp被改写了,数组越界造成
SpriteLW 2008-06-02
  • 打赏
  • 举报
回复
我知道是Z3funi 问题,但add $0x10,%esp 出错会是什么原因导致的,栈溢出还是栈被破坏?
puzzlesky 2008-06-02
  • 打赏
  • 举报
回复
看不出来
baihacker 2008-06-02
  • 打赏
  • 举报
回复
应该是里
Z3funi
这个函数里面
写越界,或者改变了不应该改变的东西
星羽 2008-06-02
  • 打赏
  • 举报
回复

应该是
call 8048344 <_Z3funi>

函数里的问题

你可以检查下这个函数,或则把它去了看看

69,371

社区成员

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

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