AIX:_snw(无符号长)中的malloc

AIX: malloc in _snw(unsigned long)?

本文关键字:中的 malloc 无符号 snw AIX      更新时间:2023-10-16

我正在尝试在AIX的测试程序中跟踪malloc分配。因此,我用调用旧系统 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 %pn", y, y);
free(y);

这并不能回答这个问题,但它确实(我希望)教授了一些技巧。

我做了:

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 程序运行测试会很好奇。 C++有各种各样的奇怪之处,它被称为malloc也就不足为奇了。 我仍然对我之前的问题感到困惑。 如果你有一个名为new_malloc的东西,为什么预编译实体会开始使用它?

最后,关于你更大的问题,AIX 的 malloc 有很多功能。 它们不一定是我的推荐。 我是一个内核空间的人,而不是一个应用程序空间类型的人。 我用得很少,我感到沮丧。 但这里有一个指向 IBM pubs 的链接:6.1 AIX Pubs。 搜索"mallocdebug"和"mallocoptions",你会发现你可以使用的各种功能。 (我记得)有 3 种不同的 malloc 算法可供选择,还有多个调试选项。

IBM也有Purify。 我从未使用过它(我是内核级别),但我非常尊重的应用程序人员喜欢它。

最后,AIX 具有跟踪工具,通常称为"内核跟踪",但它们也可以在应用程序空间中使用。 这些是迄今为止侵入性最小的技术。 通过一点点的制作,您可以关闭它们,而对运行的代码几乎没有影响,但您仍然可以打开它们(例如,当用户遇到只有他才能重新创建的问题时,在现场)。 要开始使用,请转到酒吧(上图)并搜索trchook。/etc/trcfmt 也有很多在其他任何地方都没有记录的信息。

祝你好运