关于处理程序异常后的core dump后的stack解析问题

freshui 2009-12-23 10:45:58
目前我所做的系统,在程序运行过程中,可能会出现异常 (大部分都是data alaign问题), 需要调试
目前:
1. 嵌入式MIPS系统,没有JTAG
2. 由于很多数据是硬件运算的,无法在PC的模拟版本调试
3. 目前已经可以dump出出错时的SPR和GPR,以及堆栈信息,包括所有线程的堆栈
4. 程序使用一些库,使用了-O2优化,一些函数调用的fp可能没有

问题是:如何在这样的情况下,解析出堆栈的调用信息?这样我们就可以知道到底是在何处走的哪条路径以及给了什么样的参数造成程序崩溃的。
目前我还是不清楚怎么样才能知道每个call frame的大小,如果不知道这个大小,看样子很难得到解析栈的调用关系

谁能给些思路。。
...全文
314 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
freshui 2010-12-29
  • 打赏
  • 举报
回复
呵呵, 实际上我做的是嵌入式系统,用的os是ecos, 如果每个函数都倒腾这么一句注释在里面,那没得玩了。
我只是在cpu exception的时候查看系统堆栈,将有用的信息输出到内存中再通过工具(和内核有通信协议,工具会知道内核发生了什么情况,从哪拿dump数据)。 由于内存管理这块用了非常简单的虚拟地址和物理地址一一对应关系,通过 编译的map文件,一下就可定位到堆栈中哪些地址是RA地址,这样也就确定了调用堆栈。

不过由于用了优化编译,无法确认变量。
CandPointer 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 candpointer 的回复:]

C/C++ code

#define BEGIN { printf("in %s()\n",__func__);
#define END printf("leave %s()\n",__func__); }


使用,
void printHelloWorld(void)
BEGIN
printf("%s\n","Hello World");
END


也可以把 BEGIN END……
[/Quote]

补上
#ifndef NDEBUG
#define BEGIN {
#define END }
#else
#define BEGIN { printf("in %s()\n",__func__);
#define END printf("leave %s()\n",__func__); }
#endif

CandPointer 2010-12-29
  • 打赏
  • 举报
回复

#define BEGIN { printf("in %s()\n",__func__);
#define END printf("leave %s()\n",__func__); }


使用,
void printHelloWorld(void)
BEGIN
printf("%s\n","Hello World");
END


也可以把 BEGIN END 里面的printf 换成其他内容,反正,保存 __func__ 就行了。
这个__func__是c99的
噢噢噢噢 2010-12-29
  • 打赏
  • 举报
回复

来了。。。
不用客气
就想叫yoko 2010-12-29
  • 打赏
  • 举报
回复
那不客气了:)[Quote=引用 7 楼 freshui 的回复:]
大家来接分吧 一会结贴 :)
[/Quote]
ayw215 2010-12-29
  • 打赏
  • 举报
回复
打log
Proteas 2010-12-29
  • 打赏
  • 举报
回复
问题怎么解决的呢?
freshui 2010-12-29
  • 打赏
  • 举报
回复
大家来接分吧 一会结贴 :)
freshui 2010-12-29
  • 打赏
  • 举报
回复
基本上还是dump出来对照map看, 还算可以。
cattycat 2009-12-27
  • 打赏
  • 举报
回复
data align是数据对齐吗?你在每个函数调用的部分输出一些可以跟踪的信息,就可以知道在哪个函数里异常退出了。
logiciel 2009-12-27
  • 打赏
  • 举报
回复
可在函数中插入一个变量放函数名称,这样可从STACK数据中看出调用关系。

#include <stdio.h>
#include <string.h>

#define MAX_FUNC_NAME 32

void func_0 (void)
{
char func_name[MAX_FUNC_NAME];
strcpy(func_name, "func_0");
}

void func_1 (void)
{
char func_name[MAX_FUNC_NAME];
strcpy(func_name, "func_1");
func_0();
}

int main()
{
func_1();
return 0;
}
kingstarer 2009-12-27
  • 打赏
  • 举报
回复
之前我也问过类似的问题
freshui 2009-12-27
  • 打赏
  • 举报
回复
基本上,从dump出来的栈信息,再结合反汇编,可以看到栈的调用关系
但这些都是离线分析的

如何在dump的时候直接在trace中就解析出来呢?
实际上也不需要完全解析出来,只需要将栈的各个桢解析出来了即可。<类似gdb里bt命令>
hoya5121 2009-12-26
  • 打赏
  • 举报
回复
http://www.cppblog.com/returnnull/archive/2007/03/27/20714.aspx

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧