Home
OCaml (aka Objective Caml), а также прочие ML'и, F#, Coq, etc
ocaml@conference.jabber.ru
Вторник, 20 августа 2013< ^ >
f[x] установил(а) тему: OCaml / ОКэмл / Камль -- http://ocaml.org/ | Камло - http://camlunity.ru/ | Верблюды грязи не боятся! | release crap, enjoy NIH | репортьте баги официальным дилерам | ocaml мёртв и тормозит, move on | stdlib only? - ССЗБ | Fight FUD with fire | Мойте руки перед чатом | KEEP CAML AND CURRY ON | F#, Coq - де-факто онтопик
Конфигурация комнаты
Участники комнаты

GMT+4
[00:37:07] Typhon вошёл(а) в комнату
[01:52:48] Typhon вышел(а) из комнаты
[01:58:41] gds вышел(а) из комнаты: Replaced by new connection
[01:58:43] gds вошёл(а) в комнату
[06:23:25] f[x] вошёл(а) в комнату
[07:11:12] f[x] вышел(а) из комнаты
[07:24:16] ForNeVeR вошёл(а) в комнату
[07:25:33] avkarpich вошёл(а) в комнату
[07:35:00] f[x] вошёл(а) в комнату
[10:10:10] <f[x]> ADEpt: hi
[10:10:45] <f[x]> ты там чего-то спрашивал про память итд, мы там чего-то наотвечали в чатлогах, ну и интересно как оно порешалось в результате
[10:11:11] <ADEpt> пока никак :)
[10:11:20] <ADEpt> решается вдумчивым переписыванием кода
[10:11:52] <f[x]> тулзы не помогли?
[10:12:31] <ADEpt> помогли, но ... код структурирован вокруг монады, которая инкапсулирует понятие "вычисление с сайд-эффектами, рестартуемое при смене зависимостей"
[10:12:44] <ADEpt> и где-то там Что-То Пошло Не Так с памятью
[10:13:16] <ADEpt> по крайней мере тулзы показали, что проблема где-то там, и нигде иначе
[10:13:30] Typhon вошёл(а) в комнату
[10:14:24] <f[x]> :)
[10:18:36] f[x] вышел(а) из комнаты
[10:55:30] Typhon вышел(а) из комнаты
[11:04:18] ermine вошёл(а) в комнату
[11:10:19] f[x] вошёл(а) в комнату
[11:11:22] <f[x]> а как-то описать условия на этот лик и поискать его рекурсивно в хипе?
[11:11:47] <f[x]> т.е. скажем - камлевая структура размером более N
[11:15:11] <f[x]> т.е. objsize умет обходить все руты (ну или почти умеет)
[11:15:30] <f[x]> сказать ему обходить все руты и искать это условие
[11:16:11] <f[x]> как найдёт - ковыряешь этот адрес через mlvalues чтобы понять на какой value в коде он похож
[11:18:49] <ADEpt> (у меня mlvalues не работает, а мое питон-фу оказалось слабее моего нетерпения :)
[11:19:13] <ADEpt> с обходом проблема - там куча контейнероподобных структур данных с шаренными значениями
[11:19:19] <f[x]> как именно не работает?
[11:19:24] <f[x]> gdb какой версии?
[11:19:31] <f[x]> где мой багрепорт!
[11:19:35] <ADEpt> т.е., грубо, в гиге хипа можно насчитать 15 гиг хипа, если не учитывать шаринг :)
[11:19:40] <ADEpt> гдб старый
[11:19:57] <ADEpt> GNU gdb (GDB) Red Hat Enterprise Linux (7.2-56.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
[11:20:24] <f[x]> ADEpt: objsize учитывает шаринг
[11:20:35] <f[x]> хм
[11:20:45] <f[x]> если отдельно считать - то нет
[11:20:55] <ADEpt> сейчас покажу, что точно не работает с mlvalues
[11:21:03] <f[x]> а если всё целиком - то учитывает
[11:23:45] <ADEpt> а все целиком считать не интересно - это я и в топе, грубо говоря, могу посмотреть :) Мне интересно, как оно по частям размазано и в какой момент создавалось, кем удерживается и т.п.
[11:24:50] <f[x]> c 7.2 у меня работало
[11:26:29] <f[x]> тогда как считать шаринг "правильно"?
[11:26:53] <f[x]> когда считаешь размер value?
[11:27:15] <f[x]> типа как размер уникальный этого value плюс размер доступный из других?
[11:27:25] <f[x]> это наверное на живом хипе не посчитать
[11:54:06] <ADEpt> угу
[11:54:31] <ADEpt> f[x]: Обещанная ошибка mlvalues.py:
(gdb) ml_dump camlPrintf__printf_1362
Traceback (most recent call last):
  File "~/Downloads/mlvalues.py", line 333, in invoke
  File "~/Downloads/mlvalues.py", line 286, in show
AttributeError: 'module' object has no attribute 'MemoryError'
Error occurred in Python command: 'module' object has no attribute 'MemoryError'
[11:54:47] <ADEpt> (от того, какой символ ему подсунуть, не зависит)
[11:55:12] <ADEpt> mlvalues.py только что взят с http://ygrek.org.ua/p/code/mlvalues.py
[11:58:47] <f[x]> мхм
[11:59:04] <f[x]> но memoryerror не должен возникать при дамне нормальных камловых значений
[11:59:25] <f[x]> т.е. непонятно почему его нет в redhat'овском gdb, но это не должно мешать
[11:59:45] <f[x]> т.е. при дампе левых значений вместо того чтобы продолжать дальше оно будет сразу вываливаться
[12:00:04] <f[x]> иногда это и хорошо - вместо ста экранов мусора
[12:00:12] <f[x]> ьбудет мешать только в случае замыканий
[12:00:44] <f[x]> там дампятся сырые адреса - что попало может быть
[12:11:19] <f[x]> например ml_dump &camlList
[12:11:26] <f[x]> должен работать
[12:13:51] ForNeVeR вышел(а) из комнаты: Replaced by new connection
[12:13:58] ForNeVeR вошёл(а) в комнату
[12:27:04] <ADEpt> f[x]: (gdb) p  *0x7f056258d000
$4 = 3319
(gdb) ml_dump 0x7f056258d000
Traceback (most recent call last):
  File "~/Downloads/mlvalues.py", line 333, in invoke
  File "~/Downloads/mlvalues.py", line 286, in show
AttributeError: 'module' object has no attribute 'MemoryError'
Error occurred in Python command: 'module' object has no attribute 'MemoryError'
[12:28:45] <ADEpt> если закомментарить try-catch в def show, то получается вот что:
(gdb) ml_dump 0x7f056258d000
Traceback (most recent call last):
  File "~/Downloads/mlvalues.py", line 333, in invoke
  File "~/Downloads/mlvalues.py", line 224, in show
  File "~/Downloads/mlvalues.py", line 189, in is_list
  File "~/Downloads/mlvalues.py", line 180, in size
  File "~/Downloads/mlvalues.py", line 148, in hd
AttributeError: 'gdb.Value' object has no attribute 'reinterpret_cast'
Error occurred in Python command: 'gdb.Value' object has no attribute 'reinterpret_cast'
[12:30:10] Typhon вошёл(а) в комнату
[12:31:36] <f[x]> пффф
[12:31:45] <f[x]> какой-то кастрированный gdb, ну печаль
[12:32:16] <f[x]> и даже ml_dump &camlList не работает?
[12:32:23] <f[x]> раз reinterpret_cast нету - то думаю нет
[12:32:27] <f[x]> но просто интересно
[12:32:39] klapaucius вошёл(а) в комнату
[12:33:31] <ADEpt> f[x]: да, ml_dump &camlList ведет себя абсолютно аналогично
[12:35:14] <f[x]> :(
[12:35:33] <f[x]> тогда мне надо встроить туда какую-то проверку на поломанный gdb и вываливаться красиво
[12:35:36] <f[x]> blame red hat
[12:35:56] f[x] не хочет реимплементить руками все манипуляции байтиками
[12:37:53] Kakadu вошёл(а) в комнату
[12:47:45] <ADEpt> Это CentOS
[12:47:49] <ADEpt> 6.3
[12:47:52] <ADEpt> in case it matters
[12:51:23] <ADEpt> f[x]: судя по http://sourceware.org/bugzilla/show_bug.cgi?id=11145 и http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/python/py-value.c.diff?cvsroot=src&r1=1.14&r2=1.15 , reinterpret_cast - это обертка, можно попробовать сделать через Value.cast
[12:51:51] <ADEpt> а, не. Вру
[12:54:53] <f[x]> хм, т.е. я заюзал свежую фичу
[12:55:07] <f[x]> я помню меня эти касты с ума сводили поэтому закостылял как получилось
[12:55:24] <f[x]> может получится более простым способом..
[12:57:08] <f[x]> буду фиксить
[13:00:42] <ADEpt> "cast", valpy_cast, METH_VARARGS, "Cast the value to the supplied type."
[13:00:45] <ADEpt> METH!
[13:00:50] <ADEpt> crystal meth!
[13:00:55] <ADEpt> это многое объясняет :)
[13:03:51] <ADEpt> f[x]: если заменить reinterpret_cast на просто cast, оно работает (кажется):
(gdb) ml_dump &camlList
( Closure( camlList__length_1012 , 0x3 ) , Closure( camlList__hd_1014 , 0x3 ) , Closure( camlList__tl_1017 , 0x3 ) , Closure( caml_curry2 , 0x5 , camlList__nth_1020 ) , Closure( camlList__rev_1034 , 0x3 ) , Closure( caml_curry2 , 0x5 , camlPervasives__$40_1133 ) , Closure( caml_curry2 , 0x5 , camlList__rev_append_1029 ) , Closure( camlList__flatten_1036 , 0x3 ) , Closure( camlList__flatten_1036 , 0x3 ) , Closure( caml_curry2 , 0x5 , camlList__iter_1061 ) , Closure( caml_curry2 , 0x5 , camlList__iteri_1070 ) , Closure( caml_curry2 , 0x5 , camlList__map_1040 ) , Closure( caml_curry2 , 0x5 , camlList__mapi_1051 ) , Closure( caml_curry2 , 0x5 , camlList__rev_map_1054 ) , Closure( caml_curry3 , 0x7 , camlList__fold_left_1073 ) , Closure( caml_curry3 , 0x7 , camlList__fold_right_1079 ) , Closure( caml_curry3 , 0x7 , camlList__iter2_1106 ) , Closure( caml_curry3 , 0x7 , camlList__map2_1085 ) , Closure( caml_curry3 , 0x7 , camlList__rev_map2_1094 ) , Closure( caml_curry4 , 0x9 , camlList__fold_left2_1114 ) , Closure( caml_curry4 , 0x9 , camlList__fold_right2_1123 ) , Closure( caml_curry2 , 0x5 , camlList__for_all_1132 ) , Closure( caml_curry2 , 0x5 , camlList__exists_1136 ) , Closure( caml_curry3 , 0x7 , camlList__for_all2_1140 ) , Closure( caml_curry3 , 0x7 , camlList__exists2_1148 ) , Closure( caml_curry2 , 0x5 , camlList__mem_1156 ) , Closure( caml_curry2 , 0x5 , camlList__memq_1160 ) , Closure( caml_curry2 , 0x5 , camlList__find_1196 ) , Closure( camlList__find_all_1200 , 0x3 ) , Closure( camlList__find_all_1200 , 0x3 ) , Closure( caml_curry2 , 0x5 , camlList__partition_1207 ) , Closure( caml_curry2 , 0x5 , camlList__assoc_1164 ) , Closure( caml_curry2 , 0x5 , camlList__assq_1169 ) , Closure( caml_curry2 , 0x5 , camlList__mem_assoc_1174 ) , Closure( caml_curry2 , 0x5 , camlList__mem_assq_1179 ) , Closure( caml_curry2 , 0x5 , camlList__remove_assoc_1184 ) , Closure( caml_curry2 , 0x5 , camlList__remove_assq_1190 ) , Closure( camlList__split_1215 , 0x3 ) , Closure( caml_curry2 , 0x5 , camlList__combine_1221 ) , Closure( caml_curry2 , 0x5 , camlList__stable_sort_1243 ) , Closure( caml_curry2 , 0x5 , camlList__stable_sort_1243 ) , Closure( caml_curry2 , 0x5 , camlList__stable_sort_1243 ) , Closure( caml_curry3 , 0x7 , camlList__merge_1228 ) , Closure( caml_curry2 , 0x5 , camlList__length_aux_1008 ) , Closure( caml_curry3 , 0x7 , camlList__mapi_1045 ) , Closure( caml_curry3 , 0x7 , camlList__iteri_1065 ) , Closure( caml_curry2 , 0x5 , camlList__chop_1238 ) )
[13:04:03] <ADEpt> ура :)
[13:09:04] <f[x]> nice
[13:09:25] <f[x]> осталось понять чем reinterpret_cast отличается от cast и почему я юзал именно его
[13:10:19] <f[x]> ещё тест -> ml_dump caml_globals
[13:10:22] <ADEpt> похоже, что это syntax sugar для тех, кто использует C++. Судя по диффу, который я цитировал выше, реализация reinterpret_cast - это просто вызов cast
[13:10:40] <ADEpt> да, и это тоже работает :)
[13:12:18] <ADEpt> без try-except gdb.MemoryError падает вот так:
RuntimeError: Cannot access memory at address 0x300000008
Error occurred in Python command: Cannot access memory at address 0x300000008
[13:16:45] <f[x]> ну тут смотри, как я выше говорил, при дампе "правильных" значений лезть в неправильную память оно не должно
[13:17:00] <f[x]> т.е. либо ты дампишь что-то наугад
[13:17:21] <f[x]> либо это клозурка - там тогда надо спрятать вывод сырых данных
[13:17:43] <f[x]> возможный фикс - можно сделать проверять адрес значения на попадание в хип
[13:17:54] <f[x]> и без спросу мимо хипа не лазить
[13:18:02] <f[x]> либо ловить там вообще все исключения..
[13:18:25] <f[x]> ксттаи дампить левые значения не рекомендуется ибо можно нарваться на цикл и засвопить gdb
[15:04:28] zinid вошёл(а) в комнату
[15:16:00] avkarpich вышел(а) из комнаты
[15:27:37] f[x] вышел(а) из комнаты
[16:17:15] ForNeVeR вошёл(а) в комнату
[17:32:57] zinid вышел(а) из комнаты
[17:43:10] Zbroyar вошёл(а) в комнату
[18:23:58] Zbroyar вышел(а) из комнаты
[19:16:01] f[x] вошёл(а) в комнату
[20:11:27] Typhon вышел(а) из комнаты
[20:29:55] Kakadu вышел(а) из комнаты: Logged out
[21:25:41] f[x] вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!