c、c++如何利用try catch 实现崩溃日志????

shiter
人工智能领域优质创作者
博客专家认证
2013-07-27 02:47:25
如何利用try catch 实现崩溃日志?
就是程序崩溃了,纪录崩溃的所在函数到日志?如何实现,有没有现成的例子,学习一下,谢谢!
...全文
938 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ken_scott 2013-07-28
  • 打赏
  • 举报
回复
引用 7 楼 wangyaninglm 的回复:
出错了就是堆栈信息么? 我的意思的是比如memcpy这个函数出错了,我就打印出来,那个函数调用地方出错了,第几行。这种 堆栈信息是不是有点太复杂了。 我是想给小工具添加这样一个功能,别人使用,程序崩溃以后,光把日志发回来,这样我就能修改bug了
memcpy这类就是我说的问题1 这类是没办法用C++的catch来扑捉的 不知道WINDOWS的__TRY/__CATCH/__FINALY是否可行,忘了 如果可行就好了 (同样用宏包装一层)
ken_scott 2013-07-28
  • 打赏
  • 举报
回复
1. 首先,崩溃的话,try/catch未必有用 (这个最关键了) 2. 其次,exception会往外传递,catch到的exception未必是从写代码的这个函数抛出的 (这个不太重要) 3. 再者,catch里面记日志可能会引发新的exception,导致死循环 (这个严重但不常见) 4. 最后,问个问题:是否所有抛异常的地方,你都会加catch (这个也很重要) 如果上面的问题都不是问题,下面是我想到的解决方案: 用宏来替换try/catch

#include <iostream>

void log(const char * file, const char * func, int line)
{
    std::cout << "exception: " << file << ":" << func << ":" << line << std::endl;
}

#define TRY                                  \
try                                          \
{

#define CATCH_TYPE(type)                     \
}                                            \
catch (type & e)                             \
{                                            \
    log(__FILE__, __FUNCTION__, __LINE__);

#define CATCH_ALL                            \
}                                            \
catch (...)                                  \
{                                            \
    log(__FILE__, __FUNCTION__, __LINE__);

#define CATCH_END                            \
}

int main(int argc, char * argv[])
{
    {
        TRY
            throw int();
        CATCH_TYPE(int)
            std::cout << "catch a exception" << std::endl;
        CATCH_END
    }

    {
        TRY
            throw int();
        CATCH_ALL
            std::cout << "catch a exception" << std::endl;
        CATCH_END
    }
    
    return(0);
}
shiter 2013-07-28
  • 打赏
  • 举报
回复
引用 6 楼 mougaidong 的回复:
https://www.google.com.hk/search?newwindow=1&safe=strict&client=aff-cs-360chromium&hs=P1S&q=%E6%89%93%E5%8D%B0%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E5%A0%86%E6%A0%88&oq=%E6%89%93%E5%8D%B0%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E5%A0%86%E6%A0%88&gs_l=serp.3..0i5i30.32112.32112.0.32564.1.1.0.0.0.0.204.204.2-1.1.0....0...1c.4.22.serp..0.1.203.xF3b64pzMwY
出错了就是堆栈信息么? 我的意思的是比如memcpy这个函数出错了,我就打印出来,那个函数调用地方出错了,第几行。这种 堆栈信息是不是有点太复杂了。 我是想给小工具添加这样一个功能,别人使用,程序崩溃以后,光把日志发回来,这样我就能修改bug了
turing-complete 2013-07-28
  • 打赏
  • 举报
回复
果断用glog吧
引用 7 楼 wangyaninglm 的回复:
[quote=引用 6 楼 mougaidong 的回复:] https://www.google.com.hk/search?newwindow=1&safe=strict&client=aff-cs-360chromium&hs=P1S&q=%E6%89%93%E5%8D%B0%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E5%A0%86%E6%A0%88&oq=%E6%89%93%E5%8D%B0%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E5%A0%86%E6%A0%88&gs_l=serp.3..0i5i30.32112.32112.0.32564.1.1.0.0.0.0.204.204.2-1.1.0....0...1c.4.22.serp..0.1.203.xF3b64pzMwY
出错了就是堆栈信息么? 我的意思的是比如memcpy这个函数出错了,我就打印出来,那个函数调用地方出错了,第几行。这种 堆栈信息是不是有点太复杂了。 我是想给小工具添加这样一个功能,别人使用,程序崩溃以后,光把日志发回来,这样我就能修改bug了[/quote]
shiter 2013-07-27
  • 打赏
  • 举报
回复
引用 3 楼 FENGQIYUNRAN 的回复:
http://www.doc88.com/p-073840796464.html
有些函数在遇到异常操作时,会使用抛出处理(throw),这时你调用该函数   
  时,就需要用到try   catch   来拦截这些抛出(throw)。
  void   Test(bool   Throw)   
  {   
            if   (Throw)   
                    throw   Exception("throw   in   funtion   Test.");   
  }   
    
  void   main()   
  {   
          try   {   
                  Test(true);   
          }   
          catch(Exception&   e)   {   
                  ShowMessage(e.Message);   
          }   
  }   
所有异常和崩溃信息,都记录到一个日志文件中,得成?
shiter 2013-07-27
  • 打赏
  • 举报
回复
引用 2 楼 mougaidong 的回复:
我想先问下, 你用的代码中有throw语句吗? 1. 有;不catch,崩溃时日志自然就有了。 2. 没有;catch也没有用。
不太懂这块,就是想,实现一个崩溃日志,记录一下,哪个函数崩溃了。。
FeelTouch Labs 2013-07-27
  • 打赏
  • 举报
回复
http://www.doc88.com/p-073840796464.html
有些函数在遇到异常操作时,会使用抛出处理(throw),这时你调用该函数   
  时,就需要用到try   catch   来拦截这些抛出(throw)。
  void   Test(bool   Throw)   
  {   
            if   (Throw)   
                    throw   Exception("throw   in   funtion   Test.");   
  }   
    
  void   main()   
  {   
          try   {   
                  Test(true);   
          }   
          catch(Exception&   e)   {   
                  ShowMessage(e.Message);   
          }   
  }   
turing-complete 2013-07-27
  • 打赏
  • 举报
回复
我想先问下, 你用的代码中有throw语句吗? 1. 有;不catch,崩溃时日志自然就有了。 2. 没有;catch也没有用。
FeelTouch Labs 2013-07-27
  • 打赏
  • 举报
回复
try…catch语句形式如下:

try

{

语句; //说明抛出异常的部位,该部位含有抛出异常的语句,

//如调用抛出异常的方法。

}

catch (异常类1  变量名) //按抛出的异常类进行捕获,并加处理

{

catch 处理

}

catch (异常类2  变量名)//按抛出的异常类进行捕获,并加处理

{

catch 处理

}

[finally 语句]

当catch前面的try块中发生了一个异常,try-catch语句就会自动在try块后面的各个catch块中,找出与该异常类相匹配的参数。当参数符合以下三个条件之一时,就认为这个参数与产生的异常相匹配: (1)参数与产生的异常属于一个类; (2)参数是产生的异常的超类; (3)参数是一个接口时,产生的异常实现了这一接口。 当产生的异常找到了第一个与之相匹配的参数时,就执行包含这一参数的catch语句中的Java代码,执行完catch语句后,程序恢复执行,但不会回到异常发生处继续执行,而是执行try-catch结构后面的代码。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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