我用gdb调试的时候一段C/C++写的程序, 总是会进入标准函数库的内部:
这段程序是c和c++混写的. 以前单调c程序就没这问题.
#源程序片段:
....
118 char *homeDir;
119 if ( (homeDir=getenv("ATLPROD_ROOT_DIR"))==NULL) ////
120 {
121 *messages << MSG::ERROR << "ATLPROD_ROOT_DIR not set !" << endreq;
122 exit(-1);
123 }
124 // remove lock files
125 string pipo(homeDir);
126 string com="rm "+pipo+"/jobs/lock*";
127 system(com.c_str());
128
129 asite.connexionToServer("localhost",const_cast<char *>((theParameters->getPort()).c_str()));
130
131 int SERV=asite.getDist();
调试情景:
从某一位置开始, GDB下next并不跳到下一行,而是进入:
......
119 if ( (homeDir=getenv("ATLPROD_ROOT_DIR"))==NULL) //<---main.cpp
(gdb)n
664 allocator() throw() {} //<---打这里就进入莫名奇妙的
(gdb)n
956 {
(gdb)n
957 basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
(gdb)n
135 { return strlen(__s); }
(gdb)n
957 basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
(gdb)n
135 { return strlen(__s); }
(gdb) bt
#0 main (argc=1, argv=0xbfff9b80)
at /usr/include/c++/3.2.3/bits/char_traits.h:135
(gdb) n
229 { return _M_dataplus._M_p; }
(gdb)n
668 ~allocator() throw() {}
(gdb)n
229 { return _M_dataplus._M_p; }
(gdb)n
665 allocator(const allocator&) throw() {}
(gdb)n
38 {
(gdb)n
40 __asm__ __volatile__ ("lock; xaddl %0,%2"
(gdb)n
38 {
(gdb)n
229 { return _M_dataplus._M_p; }
(gdb)n
119 { __c1 = __c2; }
(gdb)n
781 {
(gdb)n
Detaching after fork from child process 13210.
229 { return _M_dataplus._M_p; }
(gdb)n
119 { __c1 = __c2; }
(gdb)n
781 {
(gdb)n
229 { return _M_dataplus._M_p; }
(gdb)n
668 ~allocator() throw() {}
(gdb)n
229 { return _M_dataplus._M_p; }
(gdb)n
38 {
(gdb)n
40 __asm__ __volatile__ ("lock; xaddl %0,%2"
(gdb)n
38 {
(gdb)n
131 int SERV=asite.getDist(); //<----又回到了main.cpp,只是跳过了中间的行.
(gdb)
133 string temp = theParameters->getPassword();
一直next下去, 程序突然就跳回main.cpp到131行了.中间都调试不到. 很奇怪.
这种情况总是到处发生, 而且调试器指针总是跳来跳去, 一会到函数内部,一会又进入动态库,next好像不对劲. 导致调试几乎无法进行.
set step-mode off.
这跟c++ STL 有关系吗? 或者跟多进程/线程调试有关系?
不知哪位高人遇到过这样的情况. 给点提示也好. 急!
[ 此贴被XChinux在2006-03-24 23:40重新编辑 ]