大佬教程收集整理的这篇文章主要介绍了Perl的Carp模块是否有C等价物?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
#include <stdio.h> #include <stdlib.h> #define warn(...) \ fprintf(stderr,__VA_ARGS__); \ fprintf(stderr," at %s line %d\n",__FILE__,__LINE__) #define die(...) \ warn(__VA_ARGS__); \ exit(0xFF)
从Carp开始,像Perl的鲤鱼,呱呱叫,咯咯和忏悔子程序一样存在吗?我想从用户角度报告错误.
如果没有,我知道glibc中有BACktrace()和BACktrace_symbols()函数,它们与-rdynamic gcc选项一起可以为我提供函数名和代码地址的回溯.但我想要一些更好的东西;可以访问调用堆栈中的文件,行和函数名称,如Perl的调用者子例程.我可以编写自己的libcarp用于我的c程序.
编辑:2009-10-19
我正在考虑在basename(argv [0])上创建使用gdb的东西,然后处理堆栈跟踪以生成我想要的不同类型的消息.它应该能够确定我是不是在可调试的可执行文件中,还是没有gdb的系统,在这种情况下,carp和cluck将变成警告并且Craok和confess将会死亡.
我之前从未使用过这样的gdb(我只在开始时用我的程序运行它,而不是在它已经运行时).但我发现glib中的一些函数(g_on_error_stack_trace和stack_tracE)看起来非常接近我想要做的事情:它使用参数basename(argv [0])和进程id分配gdb进程,然后写入其stdin(已被重定向到管道)命令“BACktrace”后跟“退出”.然后它从结果中读取并按照它喜欢的方式解析它.这几乎就是我需要做的.
首先,我定义了一个执行实际日志记录的函数.这只是一个例子;请注意,此功能是非常不安全的(缓冲区溢出任何人?)
void strLog(char *file,char *function,int line,char *fmt,...) { char buf[1024]; va_list args; va_start(args,fmt); vsprintf(buf,fmt,args); va_end(args); fprintf(stderr,"%s:%s:%d:%s\n",file,function,line,buf); }
但是,这不太实用.可行的是使用宏来调用此函数.
#define die( ... ) \ strLog( __FILE__,__PRETTY_FUNCTION__,\ __LINE__,__VA_ARGS__ )
然后你可以像printf()一样调用.
if (answer == 42) die("Oh,%d of course.",answer);
你会得到这样的东西:
@H_421_2@main.c:10:somefunc: Oh,42 of course.好吧,没有回溯,但有些东西.
以上是大佬教程为你收集整理的Perl的Carp模块是否有C等价物?全部内容,希望文章能够帮你解决Perl的Carp模块是否有C等价物?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。