|
|
|
И снова вопрос по mon$call_stack (построение стека вызовов)
|
|||
|---|---|---|---|
|
#18+
hi all В продолжение стародавней темы от июня 2010. dimitrТаблоидЕсть задача при любом обновлении этой таблицы записать в лог стек вызовов, т.е. из каких хранимок была дана команда, приведшая в результате к обновлению этой таблицычерез мониторинг эта задача не решается. аминь. 2 dimitr : ну сделай же что-нибудь в 3.0, ы ? Ну невозможно же без слёз смотреть на вот это вот: DDL: p_01 ==> p_02 ==> p_03 ==> p_04; все p_NN - ХП; dbg_get_stack - вспомогалка для получения call-стека Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Ну как можно отладить что-то, когда на заборе написаны такие "дрова" ? (я про P_03 и P_04, которые якобы были вызваны непосредственно из P_01) ?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2014, 23:20 |
|
||
|
И снова вопрос по mon$call_stack (построение стека вызовов)
|
|||
|---|---|---|---|
|
#18+
Таблоид, в dbg_get_stack не вижу автономной транзакции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2014, 23:32 |
|
||
|
И снова вопрос по mon$call_stack (построение стека вызовов)
|
|||
|---|---|---|---|
|
#18+
dimitrв dbg_get_stack не вижу автономной транзакцииДобавил (хотя не понимаю, почему это нужно делать. Особливо если учесть, что мониторинг работает в til = snapshot...) И всё равно - не взлетает каменный цветок. Вот обновленнный DDL: ХП dbg_get_stack результат теперь НЕ возвращает, а просто пишет в таблицу dbg_stack в автономной трн Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. Код: plaintext 1. Result: WHOAMICALL_LEVELSTATEMENT_IDCALL_IDOBJECT_NAMEOBJECT_TYPESOURCE_LINESOURCE_COLUMNp_041812513812465P_01565p_042812513812466P_02569p_043812513812467P_035713p_044812513812468P_045817p_045812513812469DBG_GET_STACK569p_044812513812468P_045817p_045812513812469DBG_GET_STACK569p_043812513812467P_035713p_044812513812468P_045817p_045812513812469DBG_GET_STACK569p_044812513812468P_045817p_045812513812469DBG_GET_STACK569p_042812513812466P_02569p_043812513812467P_035713p_044812513812468P_045817p_045812513812469DBG_GET_STACK569p_044812513812468P_045817p_045812513812469DBG_GET_STACK569p_043812513812467P_035713p_044812513812468P_045817p_045812513812469DBG_GET_STACK569p_044812513812468P_045817p_045812513812469DBG_GET_STACK569p_041812513812465P_01565p_042812513812466P_02569p_043812513812467P_035713p_044812513812468P_045817p_045812513812469DBG_GET_STACK569p_044812513812468P_045817p_045812513812469DBG_GET_STACK569p_043812513812467P_035713p_044812513812468P_045817p_045812513812469DBG_GET_STACK569p_044812513812468P_045817p_045812513812469DBG_GET_STACK569p_042812513812466P_02569p_043812513812467P_035713p_044812513812468P_045817p_045812513812469DBG_GET_STACK569p_044812513812468P_045817p_045812513812469DBG_GET_STACK569p_043812513812467P_035713p_044812513812468P_045817p_045812513812469DBG_GET_STACK569p_044812513812468P_045817p_045812513812469DBG_GET_STACK569 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2014, 00:19 |
|
||
|
И снова вопрос по mon$call_stack (построение стека вызовов)
|
|||
|---|---|---|---|
|
#18+
Тут весьма интересный эффект получается. Когда в автономной тр-ции создаётся снапшот мониторинга, то стек вызовов текущего стейтмента в него попадает дважды - с основной и с автономной тр-цией (на самом деле там чуть сложнее, не хочу расписывать). Поэтому у тебя дублируются данные. PS Патч будет передан dimitr'у на рассмотрение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2014, 01:38 |
|
||
|
И снова вопрос по mon$call_stack (построение стека вызовов)
|
|||
|---|---|---|---|
|
#18+
Фигово всё, джентльмены... :( Чтобы получить в PSQL стек вызовов, надо стартовать автономку. Старт автономки при работе с TIL =SNAPSHOT - дело весьма затратное, ибо копируется вся TIP. Если (OIT-OST)/2 больше 64 Кб, то будет вызов mmap'a, т.е. обращение за памятью к OS вместо юзания внутренних буферов ФБ. Эта операция, насколько я теперь знаю, является "сериализуемой", т.е. выстраивает всех, кто хочет поиметь такую память, в очередь. Но даже если забить на это, стек всё равно будет содержать путь не до той точки, где вспыхло исключение (и именно так он показывается клиентом ), а до when-секции. То есть, самая интересная точка в нём - "не оттуда". Надо бы встроенную переменную, об чём я просил в трекере , но тот вопрос висит в unresolved и, чую, долго еще будет так висеть. Пойду-ка в дежурную аптеку. Там, говорят, завезли накануне... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2014, 02:25 |
|
||
|
И снова вопрос по mon$call_stack (построение стека вызовов)
|
|||
|---|---|---|---|
|
#18+
hvladТут весьма интересный эффект получается.После внедрёжа вот этого: http://svn.code.sf.net/p/firebird/code/firebird/trunk/ChangeLog 2014-08-12 10:21 hvlad M src/jrd/Monitoring.cpp Avoid info duplication when statements in call stack attached to different transactions (for example: monitoring snapshot is created in autonomous transaction) - стало лучше. Но эффекты тоже стали еще более "интересными". Дано: 1) master & detail таблицы, связаны по FK с on delete cascade; их имена: dbg_main & dbg_detl; 2) на detail-таблицу наверчен триггер before delete or update, который вызывает несколько процедур: Код: sql 1. 2. 3. 4. 5. 3) в master-таблицу вводится одна запись, в detail - две подчинённые к ней. 4) процедуры P_01...P_04, DBG_GET_STACK, и вообще весь DDL : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. Далее делаем два варианта удаления из dbg_detl: 1) непосредственно удаляя из неё, т.е.: delete from dbg_detl; 2) опосредованно через delete from dbg_main, что вызовет каскадный триггер на удаление подчинённых строк в dbg_detl (и это удаление уже приведёт к срабатыванию вышепоказанного триггерка dbg_detl_bud). Скрипт для варианта-1 : Код: sql 1. 2. 3. 4. 5. Его результат: всё хорошо, кроме номера транзакции в dbg_stack - см в конце поста "вопрос-2" Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Скрипт для варианта-2 : Код: sql 1. 2. 3. 4. 5. 6. Его результат: Код: plaintext 1. 2. 3. (да, это - весь результат: никаких данных в dbg_stack нету!) Фрагмент трейса для варианта-1 : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Фрагмент трейса для варианта-2 : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ИТОГО получаем: при удалении, которое вызвано каскадным триггером (вариант-2), записи в mon$call_stack недоступны. По кр. мере, вот этот запрос ("якорь" рекурсии): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. - возвращает ноль строк и рекурсия, след-но, тоже ничего не вернёт. ВОПРОС-1 : Как заполучить стек вызовов в таком случае, как вариант-2 ? Кроме того, хотя и оффтоп, но скажу сюда и ВОПРОС-2 , чтоб не забылось. Если я выполняю вот это вот (см ХП dbg_get_stack в вышеприведенном DDL): Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 17:58 |
|
||
|
И снова вопрос по mon$call_stack (построение стека вызовов)
|
|||
|---|---|---|---|
|
#18+
про каскады старый баян, на днях постараюсь поправить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 18:14 |
|
||
|
И снова вопрос по mon$call_stack (построение стека вызовов)
|
|||
|---|---|---|---|
|
#18+
dimitrпро каскады старый баян, на днях постараюсь поправитьа в 2.5 бакпорт сделаешь ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 18:25 |
|
||
|
И снова вопрос по mon$call_stack (построение стека вызовов)
|
|||
|---|---|---|---|
|
#18+
Таблоиддолжна была стартовать НОВАЯ транзакция. Но по результатам варианта-1 видим, что этого не случилось. Это так и должно быть ?Отбой, разобрался. Надо было включать в строку стейтмента, который динамически выполняется, слово 'current_transaction'. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 19:10 |
|
||
|
И снова вопрос по mon$call_stack (построение стека вызовов)
|
|||
|---|---|---|---|
|
#18+
dimitrпро каскады старый баянЕсли ты про CORE-2286 , то почему он 'Fixed' & 'Closed' ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 20:43 |
|
||
|
И снова вопрос по mon$call_stack (построение стека вызовов)
|
|||
|---|---|---|---|
|
#18+
Таблоид, нет, этот тикет совсем не причем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 22:37 |
|
||
|
И снова вопрос по mon$call_stack (построение стека вызовов)
|
|||
|---|---|---|---|
|
#18+
dimitrпро каскады старый баян, на днях постараюсь поправитьА вот тут ещё одна внезапность: если ХП вызывать через ES, то внутри неё (или тех модулей, что она вызывает) обращение к mon$call_stack - бесполезное дело. Не видна часть стека, которая была ДО вызова через ES. Это баян или нет ? DDL: ::: NB ::: см вызов процедуры P_04 via ES в ХП P_03 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. test: execute procedure p_01; select * from dbg_stack; result: WHOAMICALL_LEVELSTATEMENT_IDCALL_IDOBJECT_NAMEOBJECT_TYPESOURCE_LINESOURCE_COLUMNp_041945918P_045817p_042945919DBG_GET_STACK5135 А вот если убрать ES и вернуть взад то, что было ранее, то будет всё Ок:WHOAMICALL_LEVELSTATEMENT_IDCALL_IDOBJECT_NAMEOBJECT_TYPESOURCE_LINESOURCE_COLUMNp_04110491050P_01565p_04210491051P_02569p_04310491052P_035813p_04410491053P_045817p_04510491054DBG_GET_STACK5135 PS. LI-T6.3.0.31288 Firebird 3.0 Alpha 2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 15:51 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38719732&tid=1563403]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
| others: | 220ms |
| total: | 352ms |

| 0 / 0 |
