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

标签 c++ c malloc aix callstack

我试图在 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/

相关文章:

c++ - Vim, C++, 查找成员函数

c++ - 如何在结构中的指针上使用 cudaMalloc?

c - 头文件中的静态内联函数

c - 进程已完成,退出代码为 11 | malloc 期间出错

c++ - 如何在 else-if 语句中正确使用 or 语句 (||)

c++ - 为什么我们使用非类型模板参数?

c - C 中 free() 函数的问题

linux - Mac OS X 中是否有等同于 mallopt() 的函数?

c++ - MFC:在 win32 文本区域(mfc 应用程序)中执行进程时异步(并发)显示进程的输出

c - 使用包含 float 数组的 OpenCL 将结构传递给 GPU