gpt4 book ai didi

c++ - AIX:_snw(unsigned long) 中的 malloc?

转载 作者:太空宇宙 更新时间:2023-11-04 03:47:59 24 4
gpt4 key购买 nike

我试图在 AIX 的测试程序中跟踪 malloc 分配。因此,我将 malloc 替换为调用旧系统 malloc 的 new_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(unsigned long) 和 __svn(unsigned long) 调用,它们正在调用 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);

最佳答案

这并没有回答问题,但它确实(我希望)教会了一些技巧。

我做到了:

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 发布的链接:6.1 AIX Pubs .搜索“mallocdebug”和“mallocoptions”,您将找到可以使用的各种功能。有(我记得)3 种不同的 malloc 算法和多个调试选项可供选择。

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

最后,AIX 具有通常称为“内核跟踪”的跟踪功能,但它们也可以在应用程序空间中使用。这些是迄今为止使用的侵入性最小的技术。通过一些技巧,您可以将它们关闭,几乎不会影响正在运行的代码,但您仍然可以打开它们(例如,当用户遇到只有他可以重新创建的问题时,在现场)。首先,前往酒吧(上方)并搜索 trchook。/etc/trcfmt 也有很多其他地方没有记录的信息。

祝你好运

关于c++ - AIX:_snw(unsigned long) 中的 malloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22872997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com