AIX: malloc в _snw (без знака long)?

Я пытаюсь отследить распределение malloc в тестовой программе в AIX. Таким образом, я заменил malloc на new_malloc, который вызывает старую систему malloc, а затем распечатывает стек вызовов, используя вызов system («procstack pid»). Любопытно, что в некоторых звонках я получаю это:

0x09000000000ae23c  waitpid(??, ??, ??) + 0x190
0x090000000018d8e0  system(??) + 0x1fc
0x0000000100011a34  PrintCallStack__()() + 0x34
0x000000010000167c  malloc(0x80) + 0x3c
0x0000000100011acc  __snw(unsigned long)(0x80) + 0x4c
0x0000000100011eac  __svn(unsigned long)(0x80) + 0x4c
0x000000010000ac84  main(0x100000001, 0xffffffffffff568) + 0xc4
0x00000001000002d8  __start() + 0x98

Откуда поступают вызовы __snw (длинный без знака) и __svn (длинный без знака), которые вызывают malloc (неожиданно)? Они появляются после malloc, но до printf.

Мой тестовый код:

char* y = (char*) malloc(128);
memset(y, 0, 128);
memset(y, 'Z', 15);
printf("y=%s %p\n", y, y);
free(y);

1

Решение

Это не отвечает на вопрос, но учит (я надеюсь) несколько приемов.

Я сделал:

ls /usr/lib/*.a | while read lib ; do echo $lib ; nm $lib 2>/dev/null| egrep '__svn|__snw' ; done

который показал мне, что это из libC.a. Я тогда сделал:

mkdir /tmp/dog
cd /tmp/dog
ar x /usr/lib/libC.a
for i in * ; do echo $i ; nm $i 2> /dev/null | egrep '__svn|__snw' ; done

который показывает мне, что это произошло от ansicore_32.o

lslpp -w /usr/lib/libC.a

говорит мне, что это исходит от xlC.rte — который исходит от людей компилятора.

Так что … не отвечаю прямо на ваш вопрос, но, похоже, это связано с C ++. Было бы любопытно провести тест с программой на Си. В C ++ есть разные странности, и неудивительно, что он вызывает malloc. Я все еще путаюсь с моими предыдущими вопросами. Если у вас есть что-то с именем new_malloc, почему прекомпилирующая сущность начинает его использовать?

Наконец, по вашему большему вопросу, malloc в AIX имеет массу функций. Они не обязательно приходят как рекомендация от меня. Я парень из области ядра, а не из области приложений. Мало того, что я использовал их, я был разочарован. Но вот ссылка на пабы IBM: 6.1 Пабы AIX. Ищите «mallocdebug», а также «mallocoptions», и вы найдете различные функции, которые вы можете использовать. Есть (как я помню) 3 разных алгоритма malloc на выбор и несколько вариантов отладки.

IBM также имеет очищаться. Я никогда не использовал его (я на уровне ядра), но любитель приложений, которого я очень уважаю, любит его.

Наконец, в AIX есть средства трассировки, которые обычно называются «трассировкой ядра», но их также можно использовать в пространстве приложения. Это, безусловно, наименее инвазивный метод для использования. Приложив немного усилий, вы можете отключить их, почти не влияя на работающий код, но вы все равно сможете их включить (например, в поле, когда у пользователя есть проблема, которую только он может воссоздать). Чтобы начать, зайдите в пабы (выше) и найдите trchook. / etc / trcfmt также содержит много информации, которая нигде не документирована.

Удачи

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]