免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: HeavenTear
打印 上一主题 下一主题

绝对够有难度的代码upgrading问题。。。 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2006-05-31 19:55 |只看该作者
问题还是没有解决。。。我们的系统的log 库是以动态库提供的。。莫愁的方法要把所有的用到log的源文件重新编译一遍。。。。很不适用。。。

论坛徽章:
0
22 [报告]
发表于 2006-05-31 19:56 |只看该作者
最好能改函数定义。。。

论坛徽章:
0
23 [报告]
发表于 2006-06-01 13:19 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
24 [报告]
发表于 2006-06-01 15:36 |只看该作者
莫愁,你的方法对变参中有类域访问的情况不使用。。。比如log( DEBUG, "%s\n", BaseClass::getName())..这种用法就会编译不过,BaseClass::getName()会被预处理成BaseClass:getName() 少了一个冒号。。。SUN编辑器的大大bug.....我是在SUN的CC下编的。。不过g++可以。。。

请问__VA_ARGS__在那些编译器下可用。。。gnu的好象不可以。。。

论坛徽章:
0
25 [报告]
发表于 2006-06-01 15:45 |只看该作者
原帖由 HeavenTear 于 2006-5-31 19:55 发表
问题还是没有解决。。。我们的系统的log 库是以动态库提供的。。莫愁的方法要把所有的用到log的源文件重新编译一遍。。。。很不适用。。。

难度确实高,只能重新编译log库而不编译其它;这只能根据楼主你们用的编译器来查查有没有类似于debugger一样,可在函数调用的时候获取得该函数在哪里被调用。
如果用的是gcc的话,可看Backtraces能不能帮上忙了。

论坛徽章:
0
26 [报告]
发表于 2006-06-01 15:49 |只看该作者
原帖由 wenlek 于 2006-6-1 13:19 发表
必须使用宏定义才可以在日值中正确处理文件名称和行号,其次只是部分的C/C++支持变参的宏定义,为了移植性考虑,最好还是都定义几个宏进行相应的处理,原有的日值函数不需要修改,如定义一个参数的输出日值宏:#d ...

        
。。。。。。。                                                                                         
     #define TRACE(pri, fmt, ... ) log(pri, "["__FILE__",%d]"#fmt, __LINE__, __VA_ARGS__ )                  
                                                                                               
     56 int main()                                                                                            
     57 {                                                                                                     
     58         Log Logger;                                                                                   
     59         char *buf="hello";                                                                           
     60                             
     61 TRACE( pxeLog::TRACE, "hello,%s\n", "world" );                                                        
     62         printf(logBuf);                                                                              
     63         return 0;                                                                                    
     64 }  

我省略了Log的具体实现。。。编译通过后,打出来的是
[myLog.cpp:61]"hello,world\n"
这显然不是我想要的。。。我知道这是编译器stringnify后的结果,有什么option可以设置吗。。。

论坛徽章:
0
27 [报告]
发表于 2006-06-01 15:56 |只看该作者
原帖由 scout2004 于 2006-6-1 15:45 发表

难度确实高,只能重新编译log库而不编译其它;这只能根据楼主你们用的编译器来查查有没有类似于debugger一样,可在函数调用的时候获取得该函数在哪里被调用。
如果用的是gcc的话,可看Backtraces能不能帮上忙了。

这个方法不可行,因为如果编译器要实现你所说的debugger的内嵌类,编译器必须在编译时重建一张很大很大的信息库,才能在需要时得到某个函数在何处被调用,有点类似-g编译。。。还是要重编译。。。

论坛徽章:
0
28 [报告]
发表于 2006-06-01 15:59 |只看该作者
CU内部的高人指点一下阿。。。怎么没有看到过CU内部的人回帖阿。。呵呵。。。

论坛徽章:
0
29 [报告]
发表于 2006-06-01 16:19 |只看该作者
gcc能够获取函数被调用的地址,但是根据这个地址来确定调用的文件以及行号似乎有点难,除非编译的时候加入了调试信息.不过根据返回地址应该能找到调用的函数名.
info gcc
__builtin_return_address
__builtin_frame_address
info dlopen

论坛徽章:
0
30 [报告]
发表于 2006-06-01 17:56 |只看该作者
帖子怎么停在29楼了。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP