leak 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. //
  2. // usage: acid -l pool -l leak
  3. //
  4. include("/sys/src/libc/port/pool.acid");
  5. defn
  6. dumppool(p)
  7. {
  8. complex Pool p;
  9. a = p.arenalist;
  10. while a != 0 && a < 0x60000000 do {
  11. complex Arena a;
  12. dumparena(a);
  13. a = a.down;
  14. }
  15. }
  16. defn
  17. dumparena(arena)
  18. {
  19. local atail, b, nb;
  20. atail = A2TB(arena);
  21. complex Bhdr arena;
  22. b = a;
  23. while b < atail && b.magic != ARENATAIL_MAGIC do {
  24. dumpblock(b);
  25. nb = B2NB(b);
  26. if nb == b then {
  27. print("B2NB(", b\X, ") = b\n");
  28. b = atail; // end loop
  29. }
  30. if nb > atail then {
  31. b = (Bhdr)(b+4);
  32. print("lost at block ", (b-4)\X, ", scanning forward\n");
  33. while b < atail && b.magic != ALLOC_MAGIC && b.magic != FREE_MAGIC do
  34. b = (Bhdr)(b+4);
  35. print("stopped at ", b\X, " ", *b\X, "\n");
  36. }else
  37. b = nb;
  38. }
  39. if b != atail then
  40. print("found wrong tail to arena ", arena\X, " wanted ", atail\X, "\n");
  41. }
  42. defn
  43. isptr(a)
  44. {
  45. if end <= a && a < xbloc then
  46. return 1;
  47. if 0x7efff000 <= a && a < 0x7ffff000 then
  48. return 1;
  49. return 0;
  50. }
  51. defn
  52. dumpblock(addr)
  53. {
  54. complex Bhdr addr;
  55. if addr.magic == ALLOC_MAGIC || addr.magic == FREE_MAGIC then {
  56. local a, x, s;
  57. a = addr;
  58. complex Alloc a;
  59. x = addr+8;
  60. if addr.magic == ALLOC_MAGIC then
  61. s = "block";
  62. else
  63. s = "free";
  64. print(s, " ", addr\X, " ", a.size\X, " ");
  65. print(*(addr+8)\X, " ", *(addr+12)\X, "\n");
  66. }
  67. }
  68. defn
  69. dumprange(s, e, type)
  70. {
  71. local x, y;
  72. print("range ", type, " ", s\X, " ", e\X, "\n");
  73. x = s;
  74. while x < e do {
  75. y = *(x\X);
  76. if isptr(y) then print("data ", x\X, " ", y\X, " ", type, "\n");
  77. x = x + 4;
  78. }
  79. }
  80. defn
  81. stacktop()
  82. {
  83. local e, m;
  84. m = map();
  85. while m != {} do {
  86. e = head m;
  87. if e[0] == "*data" then
  88. return e[2];
  89. m = tail m;
  90. }
  91. return 0x7ffff000;
  92. }
  93. defn
  94. dumpmem()
  95. {
  96. local s, top;
  97. xbloc = *bloc;
  98. // assume map()[1] is "data"
  99. dumprange(map()[1][1], end, "bss"); // bss
  100. dumprange(end, xbloc, "alloc"); // allocated
  101. top = stacktop() - 8;
  102. if top-0x01000000 < *SP && *SP < top then
  103. s = *SP;
  104. else
  105. s = top-32*1024;
  106. dumprange(s, top, "stack");
  107. }
  108. defn
  109. dumpregs()
  110. {
  111. dumprange(0, sizeofUreg, "reg");
  112. }
  113. defn
  114. leakdump(l)
  115. {
  116. print("==LEAK BEGIN==\n");
  117. dumppool(sbrkmem);
  118. dumpmem();
  119. dumpregs();
  120. while l != {} do {
  121. setproc(head l);
  122. dumpregs();
  123. l = tail l;
  124. }
  125. print("==LEAK END==\n");
  126. }
  127. defn
  128. blockdump()
  129. {
  130. print("==BLOCK BEGIN==\n");
  131. dumppool(sbrkmem);
  132. print("==BLOCK END==\n");
  133. }