|
|
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
(Mac OS X) Ловлю пробои при работе с памятью, в частности - попытку повторного free. Заменил malloc, free на свои обёртки, которые внутр вызвают реальные. 1. Можно ли оболожить вызов free try-catch так, чтобы даже при попытке повторного освобождения приложение не улетало, а просто игнорировало? 2. Как вывести (в стдерр или в файл) стек вызовов, чтобы понять, кто вызывает malloc и free? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2018, 07:56 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин, во-первых, какой компилятор? алгоритм простой, раскручиваете стэк, находите по адресу возврата имя функции, показываете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2018, 09:08 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин, если весь стек не нужен и есть возможность подменить все malloc, free дефайном, подставьте просто вызовов своей функции с передачей ей номера строки и имени файла ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2018, 09:11 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Ролг Хупин, если весь стек не нужен и есть возможность подменить все malloc, free дефайном, подставьте просто вызовов своей функции с передачей ей номера строки и имени файла gcc Я уже перепрределил, но при таком подходе надо все вызовы переделывать, а это не лучший вариант. Весь стек и не нужен, по сути нужен непосредственный вызватель маллок и фри ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2018, 09:58 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
256kЯ уже перепрределил, но при таком подходе надо все вызовы переделывать, а это не лучший вариант. Весь стек и не нужен, по сути нужен непосредственный вызватель маллок и фри Все вызовы не надо трогать. Руслан про заменить на макрос Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2018, 10:07 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
21573315 , ага так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2018, 10:24 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
Dima T256kЯ уже перепрределил, но при таком подходе надо все вызовы переделывать, а это не лучший вариант. Весь стек и не нужен, по сути нужен непосредственный вызватель маллок и фри Все вызовы не надо трогать. Руслан про заменить на макрос Код: plaintext 1. а, понял, протупил, это вариант. Он поддерживается на маке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2018, 10:42 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
Dima T256kЯ уже перепрределил, но при таком подходе надо все вызовы переделывать, а это не лучший вариант. Весь стек и не нужен, по сути нужен непосредственный вызватель маллок и фри Все вызовы не надо трогать. Руслан про заменить на макрос Код: plaintext 1. было так Код: plaintext 1. сделал так: Код: plaintext 1. и для других функций тоже, компилер накидал ошибок Код: plaintext 1. 2. 3. 4. 5. 6. что не так сделал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2018, 17:10 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
256kбыло так Код: plaintext 1. сделал так: Код: plaintext 1. и для других функций тоже, компилер накидал ошибок Код: plaintext 1. 2. 3. 4. 5. 6. что не так сделал? было определение Код: plaintext 1. стало после подстановки Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2018, 17:45 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)256kбыло так Код: plaintext 1. сделал так: Код: plaintext 1. и для других функций тоже, компилер накидал ошибок Код: plaintext 1. 2. 3. 4. 5. 6. что не так сделал? было определение Код: plaintext 1. стало после подстановки Код: plaintext 1. и как переопределить равильно, чтобы использовать __FILE__,__LINE__ ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2018, 19:17 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин, не могу навскидку сказать, я глобально никогда не переопределял зачем по всем либам переопределять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2018, 20:05 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Ролг Хупин, не могу навскидку сказать, я глобально никогда не переопределял зачем по всем либам переопределять? я так понимаю - по всем - это не самоцель, но надо там, где использутся маллок/фри ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2018, 20:12 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Ролг Хупин, не могу навскидку сказать, я глобально никогда не переопределял зачем по всем либам переопределять? хорошо, как в нескольких файлах прожекта переопределить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2018, 20:16 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
Ролг Хупинkealon(Ruslan)Ролг Хупин, не могу навскидку сказать, я глобально никогда не переопределял зачем по всем либам переопределять? я так понимаю - по всем - это не самоцель, но надо там, где использутся маллок/фриТогда добавить эти макросы в какой-ни будь общий хидер после включения всех h с "перехватываемыми" определениями и всё. Если нет такого - создать и добавить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2018, 20:21 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Ролг Хупинпропущено... я так понимаю - по всем - это не самоцель, но надо там, где использутся маллок/фриТогда добавить эти макросы в какой-ни будь общий хидер после включения всех h с "перехватываемыми" определениями и всё. Если нет такого - создать и добавить. ок. Я так нимаю, что если я хочу переопределить вызовы только в некоторых файлах, тогда лучше изменить вызовы в них. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2018, 08:34 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
1. Можно ли оболожить вызов free try-catch так, чтобы даже при попытке повторного освобождения приложение не улетало, а просто игнорировало? Можно просто проверить, что присланный в free указатель из хипа, и не вызывать настоящий free. Для этого надо иметь аналог Microsoft-овского IsHeapPointer. 2. Как вывести (в стдерр или в файл) стек вызовов, чтобы понять, кто вызывает malloc и free? В общем, никак. Есть Boost::stacktrace правда, но я его не знаю, не могу сказать, при каких условиях он работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2018, 11:42 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2018, 14:38 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
2 semen.s.semen Интересный вариант! на макосе это соберется, будет работать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2018, 12:21 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
256k2 semen.s.semen Интересный вариант! на макосе это соберется, будет работать? Попытался собрать на маке, сыпется log.c:95:47: error: C does not support default arguments static inline void print_stacktrace(FILE *out = stderr, unsigned int max... ^ ~~~~~~ log.c:95:81: error: C does not support default arguments ...print_stacktrace(FILE *out = stderr, unsigned int max_frames = 63) { ^ ~~ log.c:147:25: error: use of undeclared identifier 'abi'; did you mean 'abs'? char *ret = abi::__cxa_demangle(begin_name, ^~~ abs /usr/include/stdlib.h:137:6: note: 'abs' declared here int abs(int) __pure2; ^ log.c:147:19: warning: incompatible pointer types initializing 'char *' with an expression of type 'int (int)' [-Wincompatible-pointer-types] char *ret = abi::__cxa_demangle(begin_name, ^ ~~~ log.c:147:28: error: expected ';' at end of declaration char *ret = abi::__cxa_demangle(begin_name, ^ ; log.c:147:29: error: expected expression char *ret = abi::__cxa_demangle(begin_name, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2018, 13:33 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
А меня на макосе все собирается ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2018, 14:15 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
это С++ если что не С ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2018, 14:15 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
semen.s.semenэто С++ если что не С может из-за этого, это у меня PostgreSQL odbc драйвер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2018, 18:24 |
|
||
|
Как узнать, кто вызвал функцию?
|
|||
|---|---|---|---|
|
#18+
semen.s.semenэто С++ если что не С вот исходники, может не с++ https://git.postgresql.org/gitweb/?p=psqlodbc.git ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2018, 18:26 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39674669&tid=2017792]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
599ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 932ms |

| 0 / 0 |
