免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6711 | 回复: 7
打印 上一主题 下一主题

在段错误的情况下,用backstrace打印调用栈的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-16 11:11 |只看该作者 |倒序浏览
我们设备上现在出现一个关键应用不太稳定的问题,而且现象比较随机,所以想用backtrace在SIGSEGV的信号callback函数里加入backtrace调用,来打印相应的调用栈,看看程序死在哪里。
现在的情况是,在我写的一个测试程序里,如果我写个*p=NULL;*p=1;这个backtrace是能正常把段错误的相应调用栈打印出来。可是一旦到了我们那个关键应用,同样的代码就打印不出来了。非常郁闷。

现在怀疑点有两个,一个是编译参数有问题,知道一个-fomit-frame-pointer,这个优化有时候会把栈信息给冲掉。我特地去掉了,但是问题还是出现。有哪位兄弟有相关经验?还有什么参数可能导致这个栈信息给优化掉了?

不胜感激

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2006-08-16 11:14 |只看该作者
你的程序越界之后,破坏了堆栈信息。导致无法 backtrace 出来。
建议你加个 debug counter 试试。

或者,如果你的程序是单线程的没有用到 pthread 线程库的话,你也可以用 ltrace 试一试,效果绝佳。

论坛徽章:
0
3 [报告]
发表于 2006-08-16 11:15 |只看该作者
附上相应的测试代码

#include <stdlib.h>
#include <signal.h>
#include <execinfo.h>
#include <stdio.h>
#include "testlib.h"

/* Obtain a backtrace and print it to stdout. */
void
print_trace (void)
{
  void *array[10];
  size_t size;
  char **strings;
  size_t i;

  size = backtrace (array, 10);
  strings = backtrace_symbols (array, size);

  printf("\nthe calling stack is:\n-----------------%zd stack frames.--------------------\n",size);

  for (i = 0; i < size; i++)
     printf ("%s\n", strings[i]);
  printf("------------------end of stack----------------------\n");

  free (strings);
}

/* A dummy function to make the backtrace more interesting. */
void dummy_function (int sig)
{
  if(sig==SIGSEGV)
          printf("\n------------segmentation fault\n");
  else if(sig==SIGBUS)
          printf("\n------------bus error\n");
  else if(sig==SIGTRAP)
          printf("\n------------process is trapped\n");
  print_trace ();
  exit(1);
}

void fault()
{
        int *p=0;
        *p=1;
}

void  func1()
{
        fault();
}
void  func2()
{
        func1();
}
void  func3()
{
        func2();
}


void install_sigaction()
{
  struct sigaction sact;

  sigemptyset(&sact.sa_mask);
  sact.sa_flags = 0;
  sact.sa_handler = dummy_function;
  sigaction(SIGTRAP, &sact, NULL);
  sigaction(SIGSEGV, &sact, NULL);
  sigaction(SIGBUS, &sact, NULL);
  //dummy_function ();
  func3();
}

int
main (void)
{
        install_sigaction();
  return 0;
}

论坛徽章:
0
4 [报告]
发表于 2006-08-16 11:17 |只看该作者
原帖由 flw 于 2006-8-16 11:14 发表
你的程序越界之后,破坏了堆栈信息。导致无法 backtrace 出来。
建议你加个 debug counter 试试。

或者,如果你的程序是单线程的没有用到 pthread 线程库的话,你也可以用 ltrace 试一试,效果绝佳。


前一个问题应该不存在,我特地在代码里做了个简单的段错误,不可能把栈信息给破坏
用到了多线程技术,不知道ltrace是干什么的,兄弟能点拨一下么?
谢谢

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2006-08-16 11:22 |只看该作者
有多线程就不能 ltrace 了。可惜了。
ltrace 做得还是不够好,trace 多线程时有 BUG,什么时候能够解决这个 BUG 就好了。

如果不是破坏了堆栈信息,而只是运行环境不同,就会导致同一个 binary 出现不同的现象,那我就不知道是为什么了。

BTW:你有没有试过生成 core file 然后调试一下?

core file 里也有 backtrace 的,不用你自己去调什么库。

论坛徽章:
0
6 [报告]
发表于 2006-08-16 11:33 |只看该作者
手机上的文件系统是只读的:(
另外ltrace可以在单线程的程序crash的时候,把栈信息打出来?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2006-08-16 11:38 |只看该作者
哦,原来是手机开发啊。
没搞国,不懂。另请高明好了。

PS:ltrace 是一个命令~~~

论坛徽章:
0
8 [报告]
发表于 2006-08-16 11:44 |只看该作者
具体的没有做过,不过我看过我同事的程序,在处理backtrace的时候,没有调用任何API,直接访问的是/proc的东西。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP