bug0002.pp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. unit bug0002;
  2. interface
  3. implementation
  4. {$message starting hexstr}
  5. function hexstr(val : longint;cnt : byte) : string;
  6. const
  7. hexval : string[16]=('0123456789ABCDEF');
  8. var
  9. s : string;
  10. l2,i : integer;
  11. l1 : longInt;
  12. begin
  13. s[0]:=char(cnt);
  14. l1:=longint($f) shl (4*(cnt-1));
  15. for i:=1 to cnt do
  16. begin
  17. l2:=(val and l1) shr (4*(cnt-i));
  18. l1:=l1 shr 4;
  19. s[i]:=hexval[l2+1];
  20. end;
  21. hexstr:=s;
  22. end;
  23. {$message starting dump_stack}
  24. procedure dump_stack(bp : longint);
  25. {$message starting get_next_frame}
  26. function get_next_frame(bp : longint) : longint;
  27. begin
  28. asm
  29. movl bp,%eax
  30. movl (%eax),%eax
  31. movl %eax,__RESULT
  32. end ['EAX'];
  33. end;
  34. procedure dump_frame(addr : longint);
  35. begin
  36. { to be used by symify }
  37. writeln(' 0x',HexStr(addr,8));
  38. end;
  39. {$message starting get_addr}
  40. function get_addr(BP : longint) : longint;
  41. begin
  42. asm
  43. movl BP,%eax
  44. movl 4(%eax),%eax
  45. movl %eax,__RESULT
  46. end ['EAX'];
  47. end;
  48. {$message starting main}
  49. var
  50. i,prevbp : longint;
  51. begin
  52. prevbp:=bp-1;
  53. i:=0;
  54. while bp > prevbp do
  55. begin
  56. dump_frame(get_addr(bp));
  57. i:=i+1;
  58. if i>max_frame_dump then exit;
  59. prevbp:=bp;
  60. bp:=get_next_frame(bp);
  61. end;
  62. end;
  63. end.