草庐IT

c - gdb:仅当调用函数不等于某个值时才会有条件地中断函数

在我的项目中,我有一个将调用malloc()的my_malloc()。我喜欢在gdb中设置条件断点,只有当malloc()的调用函数不等于my_mallc()时,gdb才会进入“gdb>”。这可能吗?目标是识别所有直接调用malloc()而没有通过my_malloc()的代码。 最佳答案 Iliketosetuptheconditionalbreakpointingdbsuchthatgdbwillbreakinto"gdb>"onlywhenthecallerfunctionofmalloc()isnotequaltomy_mal

c++ - 如何使用 linux perf 获取 libc6 符号(例如 _int_malloc)的调用父项?

我正在使用linuxperf分析一个C++应用程序,并且我使用GProf2dot得到了一个很好的控制流图.但是,C库(libc6-2.13.so)中的一些符号占用了总时间的很大一部分,但没有边。例如:_int_malloc占用了8%的时间,但没有调用parents。__strcmp_sse42和__cxxabiv1::__si_class_type_info::__do_dyncast一起占用了大约10%的时间,并且调用者的名字是0,它有调用者2d6935c、2cc748c和没有调用者的6。因此,我无法仅使用perf找出哪些例程负责所有这些分配和动态转换。但是,似乎其他符号(例如mal

c++ - 如何使用 linux perf 获取 libc6 符号(例如 _int_malloc)的调用父项?

我正在使用linuxperf分析一个C++应用程序,并且我使用GProf2dot得到了一个很好的控制流图.但是,C库(libc6-2.13.so)中的一些符号占用了总时间的很大一部分,但没有边。例如:_int_malloc占用了8%的时间,但没有调用parents。__strcmp_sse42和__cxxabiv1::__si_class_type_info::__do_dyncast一起占用了大约10%的时间,并且调用者的名字是0,它有调用者2d6935c、2cc748c和没有调用者的6。因此,我无法仅使用perf找出哪些例程负责所有这些分配和动态转换。但是,似乎其他符号(例如mal

c - malloc/calloc返回的内存地址是从虚拟地址空间来的吗?

char*ptr=(char*)malloc(40);printf("%u",ptr);56737856(someoutput)现在,如果我没记错的话,我们在上面看到的输出不是物理地址,而是来自虚拟地址空间。我说得对吗?有什么办法可以看到实际的物理地址吗?反之亦然(如果我上面的假设是错误的),malloc的所有内部实现是否都必须使用jemalloc算法? 最佳答案 您在用户空间应用程序中看到的所有地址都是虚拟地址。物理地址只与内核有关。从虚拟地址到物理地址的映射很复杂,因为:并非所有虚拟地址都有物理地址。(例如,未映射、延迟零填充或

c - malloc/calloc返回的内存地址是从虚拟地址空间来的吗?

char*ptr=(char*)malloc(40);printf("%u",ptr);56737856(someoutput)现在,如果我没记错的话,我们在上面看到的输出不是物理地址,而是来自虚拟地址空间。我说得对吗?有什么办法可以看到实际的物理地址吗?反之亦然(如果我上面的假设是错误的),malloc的所有内部实现是否都必须使用jemalloc算法? 最佳答案 您在用户空间应用程序中看到的所有地址都是虚拟地址。物理地址只与内核有关。从虚拟地址到物理地址的映射很复杂,因为:并非所有虚拟地址都有物理地址。(例如,未映射、延迟零填充或

c - 在 malloc 中,为什么要使用 brk?为什么不直接使用 mmap?

malloc的典型实现使用brk/sbrk作为从操作系统申请内存的主要方式。但是,他们还使用mmap来获取大分配的block。使用brk而不是mmap真的有好处吗,还是只是传统?用mmap做这一切不是同样有效吗?(注意:我在这里互换使用sbrk和brk因为它们是同一个Linux系统调用brk的接口(interface)。)作为引用,这里有一些描述glibcmalloc的文档:GNUC库引用手册:GNU分配器https://www.gnu.org/software/libc/manual/html_node/The-GNU-Allocator.htmlglibcwiki:Malloc概述

c - 在 malloc 中,为什么要使用 brk?为什么不直接使用 mmap?

malloc的典型实现使用brk/sbrk作为从操作系统申请内存的主要方式。但是,他们还使用mmap来获取大分配的block。使用brk而不是mmap真的有好处吗,还是只是传统?用mmap做这一切不是同样有效吗?(注意:我在这里互换使用sbrk和brk因为它们是同一个Linux系统调用brk的接口(interface)。)作为引用,这里有一些描述glibcmalloc的文档:GNUC库引用手册:GNU分配器https://www.gnu.org/software/libc/manual/html_node/The-GNU-Allocator.htmlglibcwiki:Malloc概述

linux - 在 Unix 系统上自动获取堆栈跟踪

在Unix系统上有哪些自动获取堆栈跟踪的方法?我的意思不是仅仅获取核心文件或与GDB交互附加,而是拥有一个SIGSEGV处理程序将回溯转储到文本文件。以下可选功能的奖励积分:在崩溃时收集额外信息(例如配置文件)。通过电子邮件将崩溃信息包发送给开发人员。能够将其添加到dlopened共享库中不需要GUI 最佳答案 仅供引用,建议的解决方案(在信号处理程序中使用backtrace_symbols)有被破坏的危险。不要使用它-是的,backtrace和backtrace_symbols会生成回溯并将其转换为符号名称,但是:backtrac

linux - 在 Unix 系统上自动获取堆栈跟踪

在Unix系统上有哪些自动获取堆栈跟踪的方法?我的意思不是仅仅获取核心文件或与GDB交互附加,而是拥有一个SIGSEGV处理程序将回溯转储到文本文件。以下可选功能的奖励积分:在崩溃时收集额外信息(例如配置文件)。通过电子邮件将崩溃信息包发送给开发人员。能够将其添加到dlopened共享库中不需要GUI 最佳答案 仅供引用,建议的解决方案(在信号处理程序中使用backtrace_symbols)有被破坏的危险。不要使用它-是的,backtrace和backtrace_symbols会生成回溯并将其转换为符号名称,但是:backtrac

c - 64 位平台上 GCC 中的基本堆使用统计信息

我需要从GCC为Linux编译的C程序中回答一个基本问题:当前有多少进程堆正在使用(由malloc分配),如果有空闲堆block,还有多少驻留.标准库的GNU实现具有mallinfo函数,它准确地报告了我需要的内容,但它只能用于32位配置,而且据我所知,没有64位等效的功能(顺便说一句,谁知道为什么?)。我在Linux上使用GCC,所以我需要这个用于Linux。但我假设堆对系统是不透明的,所以回答这个问题的唯一方法是使用标准库的实现提供的手段。在Windows平台上的MSVC实现中,没有与mallinfo功能等效的功能,但有所谓的heap-walk功能,它允许通过遍历所有信息来计算必要