社区
C#
帖子详情
如何监控一个进程退出时的调用栈信息
x1983c
2015-03-20 01:05:52
各位牛人,小弟想求助一个排查桌面程序闪退的问题。
最近公司的一个C#编写的桌面程序在客户那里总是说程序“闪退”,这个程序会调用第三方的Dll实现功能,闪退的频率不太规律,有时候一天会出现,有时候得一两天会出现,但想重现是比较困难的。
我想写一个监控这个桌面进程的程序,在程序退出时打印出监控进程的错误信息或者有关这个进程退出原因的信息,这个信息可能会找出进程闪退的原因,由于本人没有win32编程经验,只会C#程序,这里请求各位牛人帮忙分析下方案,多谢了。
...全文
180
2
打赏
收藏
如何监控一个进程退出时的调用栈信息
各位牛人,小弟想求助一个排查桌面程序闪退的问题。 最近公司的一个C#编写的桌面程序在客户那里总是说程序“闪退”,这个程序会调用第三方的Dll实现功能,闪退的频率不太规律,有时候一天会出现,有时候得一两天会出现,但想重现是比较困难的。 我想写一个监控这个桌面进程的程序,在程序退出时打印出监控进程的错误信息或者有关这个进程退出原因的信息,这个信息可能会找出进程闪退的原因,由于本人没有win32编程经验,只会C#程序,这里请求各位牛人帮忙分析下方案,多谢了。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
x1983c
2015-03-20
打赏
举报
回复
嗯,有道理,进程已退出,没办法查找线索了。 崩溃的原因我们也在分析,苦恼的是没办法重现,现在有一怀疑对象是调用第三方Dll,和客户端操作系统的问题,如果第三方的Dll运行期间崩溃导致进程退出,我们的C#主程序自然就闪退了。 有一段时间我们关闭第三方Dll调用,观察期间没出现过问题。 但我们仅是怀疑,没有办法找到程序退出的原因,程序退出都是闪退,应用程序的异常事件和AppDomain的异常事件没有触发。 我想得到进程退出时调用栈信息,再分析是不是因为调用系统某些资源还是Api导致的,如果通过这些信息能推导出是哪方出的问题就明确原因了 。
於黾
2015-03-20
打赏
举报
回复
等你外部监控程序意识到某个进程被结束了,或者自己崩溃自动终止了,这个进程占用的内存就已经释放掉了,你什么都看不出来的 你应该在自己的程序里做好故障诊断,而不是想什么歪门邪道 好比有个人病危了,你需要知道他最终是如何死去的,那么你应该让他写日记 等你获知他死了,再派侦探去查,可能早火化了
c语言exit
退出
前打印堆
栈
atexit()
调用
成功
时
,会注册指定的函数作为终止函数,在程序正常结束
时
(即
进程
通过
调用
exit() 或从 main() 函数返回)运行。如果
进程
调用
了 exec 函数(exec函数族,用于在当前
进程
中执行
一个
新的程序),会清空所注册的函数列表(这些函数不再存在于新
进程
的地址空间中)。通过信号结束的
进程
也不会
调用
这些注册的函数。注册的函数不能
调用
exit(),否则会导致递归
调用
死循环。系统
调用
atexit() 是由 POSIX 1003.1-2001 所定义,Linux 也实现了该函数。
Linux程序异常
退出
打印
调用
堆
栈
/* * 程序异常终止
时
打印异常程序
调用
堆
栈
* gcc -g -rdynamic BackTraceTest.c -o BackTraceTest * * 运行程序出现错误: * System error, Stack trace: * 0 ./BackTraceTest(SystemErrorHandler+0x77) [0x40095b] * 1 /lib64/libc.so.
C语言函数
调用
栈
(一)
程序的执行过程可看作连续的函数
调用
。当
一个
函数执行完毕
时
,程序要回到
调用
指令的下一条指令(紧接call指令)处继续执行。函数
调用
过程通常使用堆
栈
实现,每个用户态
进程
对应
一个
调用
栈
结构(call stack)。编译器使用堆
栈
传递函数参数、保存返回地址、临
时
保存寄存器原有值(即函数
调用
的上下文)以备恢复以及存储本地局部变量。 不同处理器和编译器的堆
栈
布局、函数
调用
方法都可能不同,但堆
栈
的基本概念是一...
c++ 在崩溃
时
捕获
调用
栈
用于分析
最近在做程序异常
时
堆
栈
信息
获取相关工作,上一篇文章成功的在程序creash
时
写下了dump文件,而有些情况写dump文件是 不可以的,比如在jni开发
时
,C++只做底层处理,而整个项目是android工程,这个
时
候dump文件没有了优势,那么只能在程序 creash
时
把内存
信息
打印出来,获取输出到文件中。 下面讲述下我在做堆
栈
信息
获取
时
的一些经验: 文章1:在Windows下如何在程序中获得当前
调用
栈
信息
文章2:让程序在崩溃
时
体面的
退出
之Dump文件 文章3:让程序在崩溃
时
体面的
退出
之CallStack
Linux下
监控
所有
进程
的
退出
事件(x86_64下hook系统
调用
do_exit)
我们想捕获到每个程序启动的
信息
,则要hook系统
调用
execve,我们很容易想到了通过__NR_execve来完成,在x86_64上,如果你这么做了,那么会很不幸的造成系统崩溃,为何会这样呢,查看内核源码会发现__NR_execve对应的其实是stub_execve,不能简单的替换成sys_execve,还需要处理
栈
平衡,那么该如何做呢,本文暂且不讲,后面会另起文章介绍如何hook系统
调用
execve。
C#
110,502
社区成员
642,567
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章