mac os x打印栈帧

// stacktrace.c

#include <stdio.h>
#include <dlfcn.h>

void
printframeinfo(unsigned int level, void *fp, void *ra)
{
int ret;
Dl_info info;

// Find the image containing the given address
ret = dladdr(ra, &info);
printf("#%u %s%s in %s, fp = %p, pc = %p\n",
level,
(ret) ? info.dli_sname : "?", // symbol name
(ret) ? "()" : "", // show as a function
(ret) ? info.dli_fname : "?", fp, ra); // shared object name
}

void
stacktrace()
{
unsigned int level = 0;
void *saved_ra = __builtin_return_address(0);
void **fp = (void **)__builtin_frame_address(0);
void *saved_fp = __builtin_frame_address(1);

printframeinfo(level, saved_fp, saved_ra);
level++;
fp = saved_fp;
while (fp) {
saved_fp = *fp;
fp = saved_fp;
if (*fp == NULL)
break;
saved_ra = *(fp + 2);
printframeinfo(level, saved_fp, saved_ra);
level++;
}
}

void f4() { stacktrace(); }
void f3() { f4(); }
void f2() { f3(); }
void f1() { f2(); }

int
main()
{
f1();
return 0;
}

haidragondeMacBook-Air:3-25 haidragon$ ls
stacktrace.c
haidragondeMacBook-Air:3-25 haidragon$ gcc -Wall -o stacktrace stacktrace.c
haidragondeMacBook-Air:3-25 haidragon$ ls
stacktrace  stacktrace.c
haidragondeMacBook-Air:3-25 haidragon$ ./stacktrace
#0 f4() in /Users/haidragon/Downloads/singh-src/src/3-25/./stacktrace, fp = 0x7ffee087d710, pc = 0x10f382f09
#1 ? in ?, fp = 0x7ffee087d720, pc = 0x7ffee087d740
#2 ? in ?, fp = 0x7ffee087d730, pc = 0x7ffee087d760
#3 ? in ?, fp = 0x7ffee087d740, pc = 0x7ffee087d778
#4 start() in /usr/lib/system/libdyld.dylib, fp = 0x7ffee087d760, pc = 0x7fff6eb02ed9
haidragondeMacBook-Air:3-25 haidragon$ ls
stacktrace  stacktrace.c
haidragondeMacBook-Air:3-25 haidragon$ ll
-bash: ll: command not found
haidragondeMacBook-Air:3-25 haidragon$ 

原文地址:https://blog.51cto.com/haidragon/2416035

时间: 2024-11-06 03:45:04

mac os x打印栈帧的相关文章

Linux下追踪函数调用,打印栈帧

事情的起因是这样的,之前同事的代码有一个内存池出现了没有回收的情况.也就是是Pop出来的对象没有Push回去,情况很难复现,所以在Pop里的打印日志,跟踪是谁调用了它,我想在GDB调试里可以追踪调用的栈帧,那也一定有方法实现.首先上网搜索了一下,并没有结果!还好代码量不是很多,只能用最笨的方法,在每个调用Pop的地方,传参,把调用的文件,行号作为字符串传进去,在日志里打印!忙活完了,总感觉一定是有方法可以实现查看调用栈帧的,于是在QQ群里的问了下,果然有这方面经验的同学给出了答案! 主要是通过b

Mac OS X 背后的故事

Mac OS X 背后的故事 作者: 王越  来源: <程序员>  发布时间: 2013-01-22 10:55  阅读: 25840 次  推荐: 49   原文链接   [收藏] 作者王越,美国宾夕法尼亚大学计算机系研究生,中国著名 TeX 开发者,非著名 OpenFOAM 开发者. Mac OS X 背后的故事(一)力挽狂澜的Ellen Hancock Mac OS X 背后的故事(二)Linus Torvalds的短视 Mac OS X 背后的故事(三)Mach之父Avie Tevan

Mac OS X上使用Wireshark抓包

Wireshark针对UNIX Like系统的GUI发行版界面采用的是X Window(1987年更改X版本到X11).Mac OS X在Mountain Lion之后放弃X11,取而代之的是开源的XQuartz(X11.app).因此,在Mac OS X上安装Wireshark之前,需要先下载安装XQuartz. 1.安装XQuartz XQuartz(XQuartz-2.7.6.dmg)安装完成后,按照提示需要注销重新登录,以使XQuartz作为默认的X11 Server. 安装成功后,在终

【链接】函数栈帧

本节通过反汇编可执行文件得到的文件,研究函数栈帧的相关内容: 栈帧整体示意图如下 示例代码 #include <stdio.h> #include <iostream> using namespace std; int z = 10; int add(int x, int y) { return x+y+z; } int inc20(int x) { int y = 10; return add(x, y); } int main(void) { int a = 30; a = i

Mac OS X

Mac OS X 除了微软自家的Windows平台, .NET Core针对Mac OS以及各种Linux(RHEL.Ubuntu.Debian.Fedora.CentOS和SUSE等)都提供了很好的支持,我们先来体验一下使用Mac来开发.NET Core应用,在这之前我们照例先得构建我们的开发环境. 一.安装开发环境 和Windows一样,如果我们下午在Mac上进行.NET Core应用的开发,我们只需要安装 .NET Core SDK和相应的IDE就可以了.对于前者,我们可以直接从微软官方站

Mac OS X 快捷键

启动快捷键 按下按键或组合键,直到所需的功能出现(例如,在启动过程中按住 Option 直到出现"启动管理程序",或按住 Shift 直到出现"安全启动").提示:如果启动功能未起作用,而您使用的是第三方键盘,请连接 Apple 键盘,然后再试一次. 按键或组合键 功能 Option 显示所有可引导宗卷(启动管理程序) Shift 执行安全启动(以安全模式启动) C 从可引导磁盘启动(DVD.CD) T 以 FireWire 目标磁盘模式启动 N 从 NetBoot

.NET Core多平台开发体验[2]: Mac OS X

除了微软自家的Windows平台, .NET Core针对Mac OS以及各种Linux(RHEL.Ubuntu.Debian.Fedora.CentOS和SUSE等)都提供了很好的支持,我们先来体验一下使用Mac来开发.NET Core应用,在这之前我们照例先得构建我们的开发环境. 一.安装开发环境 和Windows一样,如果我们下午在Mac上进行.NET Core应用的开发,我们只需要安装 .NET Core SDK和相应的IDE就可以了.对于前者,我们可以直接从微软官方站点(https:/

Mac os安装git

这里先介绍下使用Command-line.1,下载Git installer,地址:http://git-scm.com/downloads2,下载之后打开,双击.pkg安装3, 打开终端,使用git --version命令查看安装版本,有就是安装成功了/*以下4.5命令如果已经使用Bitbucket创建过了,将会自动包含*/4,创建一个全球用户名git config --global user.name "FIRST_NAME LAST_NAME"5,创建一个全球邮箱git conf

苹果Mac OS X系统十三年视觉变化发展史

1Mac OS 9 一个普通的桌面操作系统 经过多个测试版本后,苹果终于正式公布OS X 10.10 Yosemite操作系统.苹果称这个第11版的OS X系统是自从2001年问世以来在视觉效果上变化最大的一次.那么事实真是如此么?下面我们就一起来回顾一下OS X系统的发展历史吧. 苹果Mac OS X系统十三年视觉变化发展史 早期OS X版本在苹果电脑内部以大型猫科动物为代号,如10.0版本的代号是Cheetah(猎豹),以及10.1版本代号为Puma(美洲狮).在苹果的产品市场10.2版本以