高手帮忙看下

高性能架构探索 2011-10-24 12:01:35

#ifdef _WIN32
#define log1(sock_logr, s, a1) \
do { \
struct timeb __log_buft; \
char __log_buf[2048] = {0}; \
ftime(&__log_buft); \
_snprintf(__log_buf, 2047, "%d.%03d:%s:%d:" s "\n", __log_buft.time, __log_buft.millitm, "client.c", __LINE__, (a1)); \
write2((sock_logr), __log_buf, (INT32) strlen(__log_buf)); \
if (TEST_DEBUG && g_pDbgFile != NULL) fprintf(g_pDbgFile, "LOGGED: %s", __log_buf); \
} while(false)
#else
#define log1(sock_logr, s, a1) \
do { \
struct timeb __log_buft; \
char __log_buf[2048]; \
ftime(&__log_buft); \
snprintf(__log_buf, 2048, "%d.%03d:%s:%d:" s "\n", __log_buft.time, __log_buft.millitm, "client.c", __LINE__, (a1)); \
write2((sock_logr), __log_buf, (INT32) strlen(__log_buf)); \
if (TEST_DEBUG && g_pDbgFile != NULL) fprintf(g_pDbgFile, "LOGGED: %s", __log_buf); \
} while(false)
#endif


同样都是上面的代码,Linux下运行正常,Windows下竟然在_sanprintf里面报错...

堆栈如下:


> xec.exe!_output_l(_iobuf * stream=0x0012e5c8, const char * format=0x0041a288, localeinfo_struct * plocinfo=0x00000000, char * argptr=0x0012e5fc) 行1648 + 0x1 字节 C++
xec.exe!_snprintf(char * string=0x0012e784, unsigned int count=0x000007ff, const char * format=0x0041a288, ...) 行130 + 0x1e 字节 C
xec.exe!XProbe(unsigned int sServerLog=0x001ebb10) 行1130 + 0x5d 字节 C++
ws2_32.dll!776a305c()
[下面的框架可能不正确和/或缺失,没有为 ws2_32.dll 加载符号]
ws2_32.dll!776ac549()
xec.exe!XInit(const char * pchIP1=0x0012ff24, const char * pchIP2=0x0012ff10, unsigned int * psServerLog=0x0012fdb8, char * pchID=0x0054205b, int * pnErrCode=0x0012fdb4) 行175 + 0x15 字节 C++
xec.exe!main(int argc=0x00000005, char * * argv=0x00542000) 行76 + 0x23 字节 C++
xec.exe!__tmainCRTStartup() 行327 + 0x12 字节 C
kernel32.dll!76f31174()
ntdll.dll!775ab3f5()
ntdll.dll!775ab3c8()

...全文
189 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zsyddl2 2013-07-22
  • 打赏
  • 举报
回复
这个 __LINE__ 格式化 是 %d . %s 就用了 不可预测的内存。整个 snprintf 参数 错位。
紫冰枫 2011-10-24
  • 打赏
  • 举报
回复
不明白,帮顶..
ouyh12345 2011-10-24
  • 打赏
  • 举报
回复
双击_snprintf,然后看变量的值
cocoabird 2011-10-24
  • 打赏
  • 举报
回复
不明白,帮顶
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 kevin_qing 的回复:]
win32下int和long是一样的...除非是long long才会造成问题啊
[/Quote]
可能微软的类型检查更加严格吧。你可以去试试,
int d;
snprintf 时指定为long型都出错
Kevin_qing 2011-10-24
  • 打赏
  • 举报
回复
win32下int和long是一样的...除非是long long才会造成问题啊
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 kevin_qing 的回复:]
chbuf不是0结尾的...访问地址越界了
[/Quote]
呵呵,跟这个没关系

我跟踪了下,原来是Windows下的实现机制跟Linux下有所不同

在Linux下, __log_buft.time是int,但在Windows下是long,所以出现了这种问题,但现在还不能确定会不会只是这个原因,好了结贴...
Kevin_qing 2011-10-24
  • 打赏
  • 举报
回复
chbuf不是0结尾的...访问地址越界了
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>
#include <sys/timeb.h>

void log1(void *sock_logr, void *s, char *a1)
{
do {
int a =1 , b =1;
struct timeb __log_buft;
char __log_buf[2048] = {0};
ftime(&__log_buft);
snprintf_s
_snprintf(__log_buf, 2048, "%d.%03d:%s:%d:\n", a, b, __LINE__, (a1));
} while(false);
}


int _tmain(int argc, _TCHAR* argv[])
{
char chBuf[20];
int a;
log1(&a, "%s", chBuf);
return 0;
}

尝试着将宏改成了函数,就是上述代码运行时,所遇到的问题
luciferisnotsatan 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 namelij 的回复:]

引用 7 楼 luciferisnotsatan 的回复:
_output_l 这代码都是给出的,可以跟进去看看到底是什么问题。

给snprintf的参数都没问题
retval = _output_l(outfile,format,NULL,arglist);这个是sprintf中的系统函数调用
就是在上面这个函数里面down的,然后我跟进去,说是无效指针,但是
在snprintf……
[/Quote]
看看说的是哪个指针无效了。
堆栈上那几个地址看上去还是比较正常的。
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 luciferisnotsatan 的回复:]
_output_l 这代码都是给出的,可以跟进去看看到底是什么问题。
[/Quote]
给snprintf的参数都没问题
retval = _output_l(outfile,format,NULL,arglist);这个是sprintf中的系统函数调用
就是在上面这个函数里面down的,然后我跟进去,说是无效指针,但是
在snprintf中

FILE str;
REG1 FILE *outfile = &str;

format是格式化列表,具体为: "%d.%03d:%s:%d:" s "\n"
arglist也是snprintf自己定义的,与我所传参数无关
我再仔细跟下
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kevin_qing 的回复:]
define log1(sock_logr, s, a1)

_snprintf(__log_buf, 2047, "%d.%03d:%s:%d:" s "\n", ...,(a1)


应该是s和a1的问题,估计某个格式化参数linux和win32支持不太一样,看不到你的实际宏参数,没法判断详细情况

找到调用的地方,看看s和a1是什么玩意儿
[/Quote]
log1(sServerLog, "%s", chBuf);
sServerLog 是个SOCKET,chBuf是个char数组
七擒关羽 2011-10-24
  • 打赏
  • 举报
回复
猜测:可能_sanprintf的动态链接库链接失败,那么是你的库有问题或编译器出错
Kevin_qing 2011-10-24
  • 打赏
  • 举报
回复
define log1(sock_logr, s, a1)

_snprintf(__log_buf, 2047, "%d.%03d:%s:%d:" s "\n", ...,(a1)


应该是s和a1的问题,估计某个格式化参数linux和win32支持不太一样,看不到你的实际宏参数,没法判断详细情况

找到调用的地方,看看s和a1是什么玩意儿
luciferisnotsatan 2011-10-24
  • 打赏
  • 举报
回复
_output_l 这代码都是给出的,可以跟进去看看到底是什么问题。
hengshan 2011-10-24
  • 打赏
  • 举报
回复
windows下什么是这个函数呢 _snprintf
用snprintf也可以啊
老邓 2011-10-24
  • 打赏
  • 举报
回复
尝试下:snprintf_s
luciferisnotsatan 2011-10-24
  • 打赏
  • 举报
回复
具体出什么错呢?

xec.exe!_output_l(_iobuf * stream=0x0012e5c8, const char * format=0x0041a288, localeinfo_struct * plocinfo=0x00000000, char * argptr=0x0012e5fc)
这几个参数看上去也没什么问题。

64,654

社区成员

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

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