发新话题
打印

【求助】如何解决由于堆栈破坏引起函数调用异常的问题

【求助】如何解决由于堆栈破坏引起函数调用异常的问题

int func1()
$ V( \- q+ n) Y5 i* ?- d0 ?1 ]{
. {2 J) B# P: h double rand1,partsum;/ ^/ {% n& {/ ?
int i;
* [" q% ?0 ?! u8 ^& s% P partsum=0.0;i=0;
& q+ U6 I* l9 A' a  H; b, g. U .....
( g7 _; c0 P6 B$ h. p9 h: l .....
# R, s$ m/ u6 _  J5 i do{6 o  d+ }4 O7 P2 B& S$ C' L/ `
......
. N. |0 W5 b! g) b, Hsentence 24 I% f: Z4 v) u  d: |+ I
......
5 f4 v# i! a3 Y+ T   }while(.....);
& `6 w/ A8 b; `  K6 I! y8 f9 m+ P return (i);2 h1 p8 M, ^- Z: Y' c
}
6 j7 J$ x: t9 B8 a+ N0 G' f
$ U9 m  r9 @$ n- V
7 |9 D# P, U! X2 Yvoid func2(State *start_state,State *end_state)  e4 I, j9 N& a! L" ^
{
! R0 P) }; A- V) X unsigned int k,j,k1,k2;. W8 B( I5 ]' J3 `: _. |+ w
j=0;7 y' Y7 x4 u; O3 Q. c
do{' {% l7 f/ p8 @; y# [
  k1=func1();2 K$ c% J! l. N/ h
repeat_func1:k2=func1();/ }: f) ^1 c% Q. A/ P0 h
  if(k1==k2)
1 z# \( `9 C% d$ A3 C1 q$ k   goto repeat_func1;
, E6 r& ^$ F: F* U3 ]" _  ..... j: Z' o( l. X# |0 b$ {
sentence 1
7 B# H' `1 `$ @& Q0 R .....0 U: F3 t; O9 _1 N
}while(.....);
+ N, j) t. i7 |# \2 A}
+ v6 I7 }, v( _5 i6 l: j9 U  A
. x1 O7 r2 Q1 d8 q* H* {  K2 Y我用gdb对我的程序进行调试,通过单步跟踪程序,我发现几个很奇怪的问题。
9 P: n8 O* F. F7 a/ H7 z) }4 N0 ^问题1:当单步执行程序进入函数func1()后,我用info locals查看函数func1()的局部变量,结果只能看到变量j,k的取值,看不到变量k1,k2的取值,用print k1或print k2查看k1或k2时显示"no sumbol "k1" in current context。' H" v4 k2 a9 X
问题2:当函数func2()调用func1()时,进入函数func1时,用backtrace查看函数调用栈时,在栈顶看不到func1。按常理函数调用栈里应该能看到func1()才对,不知是何原因。) c3 q3 U  Z! @+ M
问题3:当函数func2()调用func1(),执行函数func2()中代码时,本来func1()中的局部变量l跟func2()中的局部变量没有任何关系,结果单步跟踪程序执行时却发现变量i与变量k却保持同步变化。
! ?8 u+ ^  L4 M6 W7 y问题4:在函数func1()执行过程中,在执行完函数func1()中的一个循环,跳出func1()中的do-while循环体后,本来应该执行函数func1()中的sentence2直接返回,但在单步跟踪程序执行过程中,程序却跳到函数func1()中的去执行其中一个语句sentence1,执行完sentence1后又返回函数func2(),重新执行func2()。* {$ i+ x2 E& t8 D1 H
上述问题我考虑了很久,但就是不能找出原因所在,希望高人能指点迷津!不胜感激      

TOP

你最好发一个完整点的代码。不然很难看出问题所在,你说的sentence1我都没看到在那里      

TOP

什么叫局部变量?……      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

int select()
" a0 c' d. a( J' u" r: L/ k{6 ?3 n% j4 k- U; j
        double rand1,partsum;
% x/ w! A% k+ V  D        int i;, v' x, o" N; @6 Z
        partsum=0.0;i=0;! [' f; n* D+ n
        rand1=((float)(MY_RANDOM%16384)/16383.0);
. q: Y. \/ b2 a& K        rand1*=sum_of_fitness;/ t1 `& q1 r$ [0 M1 W/ E
        do{
* ]- c, r, ~7 @. [. {. \                partsum+=gold_pop->fitness;. k, G4 J. K" C) r9 o& \& D' [  t
                i=i+1;/ I3 I& T4 C: H/ R* g
        }while((partsum<rand1)&&(i<popsize));  t6 z% R9 k4 o7 L+ B$ ^- Y* z
        return (i-1);
2 X( P& L+ G) s9 W& \; B}
0 q' q0 r4 B9 s7 b6 Y. A
; ^% `7 Z! _2 t2 Uvoid generation(State *start_state,State *end_state)# z3 B2 s! P+ z+ \
{
! Q3 T! X5 J  [( z, r. q) ^        unsigned int k,j,mate1,mate2;% m! @6 @! k% Z, X8 o
        j=0;7 H( o$ K: f) \: }5 K5 C
        do{, h- X. a$ o6 J
                mate1=select();
  Q. Q8 d& _4 E' u9 ]repeat_select1:mate2=select();- P; Q0 k" [/ [+ ~3 r, F
                if(mate1==mate2)
+ y4 }% [! K! N! x% i3 H                        goto repeat_select1;
$ I% h. C5 k$ C% {0 a" k                crossover(gold_pop[mate1],gold_pop[mate2],j);0 n2 v4 T- p4 x' z7 o; t2 R
                gnew_pop[j]->num_of_inconsistents=num_of_inconsistents(start_state,end_state,gnew_pop[j]);
0 t' X" ~+ o* \5 V- T- U                gnew_pop[j]->parent1=mate1;+ o' B# U, A3 B5 E: q
                gnew_pop[j]->parent2=mate2;" K. n" @( J$ ?" v& X& R9 f7 e3 Z/ S
                gnew_pop[j+1]->num_of_inconsistents=num_of_inconsistents(start_state,end_state,gnew_pop[j+1]);
4 i- \, t$ p9 [                gnew_pop[j+1]->parent1=mate1;7 D3 e: v# \# ?7 Z% [- o' ?
                gnew_pop[j+1]->parent2=mate2;0 X; s( ]" P4 U) A+ C
                if(gnew_pop[j]->fitness>min)
0 _/ f; p8 Y: ~+ p1 v) l& Z: ~$ d' k                {8 ~; d7 l0 @, H3 C+ t: C
                        for(k=0;k<gnew_pop[j]->num_of_actions;k++)
  A/ B( x2 T0 c0 e                                if(k>=gold_pop[minpp]->num_of_actions)
( u2 J/ }; P3 ?5 [! E- p& \                                        gold_pop[minpp]->actions[gold_pop[minpp]->num_of_actions++]=gnew_pop[j]->actions[k];
7 |" m- |& |" I$ P. S5 f, [' s                                else7 g( h8 [, n9 o( [% u+ `* N
                                        gold_pop[minpp]->actions[k]=gnew_pop[j]->actions[k];
1 c; I! ~. g+ b/ w: q$ X                        gold_pop[minpp]->num_of_actions=k+1;
* z8 I" E3 c1 r  v/ Y                        gold_pop[minpp]->num_of_inconsistents=gnew_pop[j]->num_of_inconsistents;
* ]3 K) y6 x% o; @; f6 Y' y9 ^                }
4 ]* G# O/ C7 s; n7 b$ w4 J4 U                if(gnew_pop[j+1]->fitness>min)
$ |9 V, Y  z  N: Z9 S* y                {
" J5 T* n- t. ^5 g; d6 c                        for(k=0;k<gnew_pop[j+1]->num_of_actions;k++)
2 o3 _. v3 ]& Y                                if(k>=gold_pop[minpp]->num_of_actions)
- Q9 L2 _9 p* Z" ?& D                                        gold_pop[minpp]->actions[gold_pop[minpp]->num_of_actions++]=gnew_pop[j+1]->actions[k];
8 W8 I$ e6 J- x( C$ E* S                                else2 z) @# l0 l# S
                                        gold_pop[minpp]->actions[k]=gnew_pop[j+1]->actions[k];
5 p# r$ B) b) y0 g- Y, x3 w                        gold_pop[minpp]->num_of_actions=k+1;) L6 j& L( }7 o, T/ x# c  S
                        gold_pop[minpp]->num_of_inconsistents=gnew_pop[j+1]->num_of_inconsistents;
1 T2 R6 R  b# C& U  J                }
2 d# O8 \$ d8 y9 V& H                j=j+2;" @: ~) P9 f, A" A
        }while(j<popsize);
! e  t, l8 |9 o; Z2 c}
: x/ m4 H( t  r! _. W% q% n- q就是generation()函数调用select()函数时# A' B, R+ I! B5 o0 ?* |
问题1:当单步执行程序进入函数generation()后,我用info locals查看函数generation()的局部变量,结果只能看到变量j,k的取值,看不到变量mate1,mate2的取值,用print mate1或print mate2查看mate1或mate2时显示"no sumbol "mate1" in current context。
7 `3 T) W, r) z* N$ r问题2:当函数generation()调用select()时,进入函数select()时,用backtrace查看函数调用栈时,在栈顶看不到select()。按常理函数调用栈里应该能看到select()才对,不知是何原因。
" _7 g: o0 r5 ?) U$ w4 m4 a问题3:当函数generation()调用select(),执行函数select()中代码时,本来select()中的局部变量l跟generation()中的局部变量没有任何关系,结果单步跟踪程序执行时却发现select()中的变量i与generation()中的变量k却保持同步变化。1 }4 Z; h2 w# ?3 \+ V8 o
问题4:在函数select()执行过程中,在执行完函数select()中的一个循环,跳出select()中的do-while循环体后,本来应该执行函数select()中的return (i-1)直接返回,但在单步跟踪程序执行过程中,程序却跳到函数generation()中去执行其中一个语句,然后又返回函数select(),重新执行select()。程序最终会出现Sementation Fault的提示      

TOP

发新话题