服务器上的程序跑一段时间以后,进程就不存在了。
放开core文件限制:ulimit -c unlimited
等待产生core文件
分析core文件
(gdb) bt
#0 0x008711d3 in strlen () from /lib/libc.so.6
#1 0x00840c0e in vfprintf () from /lib/libc.so.6
#2 0x008613f4 in vsnprintf () from /lib/libc.so.6
#3 0x00846ec5 in snprintf () from /lib/libc.so.6
#4 0x08050598 in CHashMDM::Add (this=0x8073000, domain=0x2f36925c "xn--chinaka%64s-.com", tFrstVst=1372868283,
nHourAvgFrqncy=30) at ./src/CHashMDM.cpp:36
#5 0x0805244d in CTaskTime::Run (this=0x9d712d0) at ./src/CTaskTime.cpp:117
#6 0x080589f6 in ThreadRun (pThread=0x9d712d0) at src/common/thread.cpp:24
#7 0x0097d832 in start_thread () from /lib/libpthread.so.0
#8 0x008d2e0e in clone () from /lib/libc.so.6
(gdb) l CHashMDM.cpp:36
36 snprintf(Data.dm, sizeof(Data.dm), dm);
漏了格式化输出:, "%s",导致snprintf把紧接着的参数domain当作格式化字符串,遇到网址xn--chinaka%64s-.com时,把%64s当作格式化字符来解释,
但又缺少了%64s的传入参数,程序就崩溃了。
参考:
放开core文件限制:ulimit -c unlimited
等待产生core文件
分析core文件
(gdb) bt
#0 0x008711d3 in strlen () from /lib/libc.so.6
#1 0x00840c0e in vfprintf () from /lib/libc.so.6
#2 0x008613f4 in vsnprintf () from /lib/libc.so.6
#3 0x00846ec5 in snprintf () from /lib/libc.so.6
#4 0x08050598 in CHashMDM::Add (this=0x8073000, domain=0x2f36925c "xn--chinaka%64s-.com", tFrstVst=1372868283,
nHourAvgFrqncy=30) at ./src/CHashMDM.cpp:36
#5 0x0805244d in CTaskTime::Run (this=0x9d712d0) at ./src/CTaskTime.cpp:117
#6 0x080589f6 in ThreadRun (pThread=0x9d712d0) at src/common/thread.cpp:24
#7 0x0097d832 in start_thread () from /lib/libpthread.so.0
#8 0x008d2e0e in clone () from /lib/libc.so.6
(gdb) l CHashMDM.cpp:36
36 snprintf(Data.dm, sizeof(Data.dm), dm);
漏了格式化输出:, "%s",导致snprintf把紧接着的参数domain当作格式化字符串,遇到网址xn--chinaka%64s-.com时,把%64s当作格式化字符来解释,
但又缺少了%64s的传入参数,程序就崩溃了。
参考:
其实这是函数调用时少参数的低级错误,但是编译器有合理的解释而并未报错。
不要依赖编辑器、编译器。基本功要扎实。写程序要专心。