【发布时间】:2016-03-08 17:11:59
【问题描述】:
我有一个脚本通过 SSH (libssh2) 连接到我的 10 台服务器之一。该程序使用fork 作为线程系统。它正在进入服务器,执行命令(如free -m 或检查 CPU 使用情况),然后通过 HTTP REQUEST 将输出发送到另一台服务器。
它工作得很好,但有时它不会将数据发送回 HTTP SERVER。我用puts('DEBUG123 ...') 做了一点调试,看看它在哪里崩溃。我这样做是因为我使用FORK,但我无法看到它在哪里崩溃。下面你会看到代码。
... code from the fork
puts("DEBUG 6");
sprintf(param,"%s%s",param,my_encode(info));
puts("DEBUG 6.5");
getContent(MY_HOST,HOST_IP,param);
puts("DEBUG 7");
... code from the fork
在将数据发送到 HTTP SERVER 之前加密我的数据的 my_encode 函数的代码:
char *my_encode(char* bytes_to_encode)
{
puts("S-DEBUG 1");
int in_len = strlen(bytes_to_encode);
puts("S-DEBUG 1.1");
char buf[5200];
char *res = (char *)malloc(3600);
puts("S-DEBUG 1.2");
memset(buf,0,1200);
puts("S-DEBUG 1.3");
memset(res,0,3600);
puts("S-DEBUG 2");
strcpy(buf,base64_encode(bytes_to_encode,in_len));
for(int i=0;i<strlen(buf);i++)
{
strcat(res,switch_encode(buf[i]));
}
puts("S-DEBUG 3");
return res;
}
这是我得到的输出:
Linux -> username password 1.2.3.4 22
DEBUG 2
DEBUG 3
DEBUG 4
DEBUG 5
DEBUG 6
S-DEBUG 1
S-DEBUG 1.1
S-DEBUG 1.2
S-DEBUG 1.3
S-DEBUG 2
S-DEBUG 3
DEBUG 6.5
DEBUG 7
DEBUG 1
-- SUCCESSFUL SEND
Linux -> username password 1.2.3.4 22
DEBUG 2
DEBUG 3
DEBUG 4
DEBUG 5
DEBUG 6
S-DEBUG 1
S-DEBUG 1.1
S-DEBUG 1.2
S-DEBUG 1.3
S-DEBUG 2
S-DEBUG 3
DEBUG 6.5
DEBUG 7
DEBUG 1
-- SUCCESSFUL SEND
Linux -> username password 1.2.3.4 22
DEBUG 2
DEBUG 3
DEBUG 4
DEBUG 5
DEBUG 6
S-DEBUG 1
S-DEBUG 1.1
S-DEBUG 1.2
S-DEBUG 1.3
S-DEBUG 2
S-DEBUG 3
DEBUG 6.5
DEBUG 7
DEBUG 1
-- SUCCESSFUL SEND
Linux -> username password 1.2.3.4 22
DEBUG 2
DEBUG 3
DEBUG 4
DEBUG 5
DEBUG 6
S-DEBUG 1
S-DEBUG 1.1 <--- HERE IT IS CRASHING
DEBUG 1
-- ERROR ON SEND
Linux -> username password 1.2.3.4 22
DEBUG 2
DEBUG 3
DEBUG 4
DEBUG 5
DEBUG 6
S-DEBUG 1
S-DEBUG 1.1
S-DEBUG 1.2
S-DEBUG 1.3
S-DEBUG 2
S-DEBUG 3
DEBUG 6.5
DEBUG 7
-- SUCCESSFUL SEND
Linux -> username password 1.2.3.4 22
DEBUG 2
DEBUG 3
DEBUG 4
DEBUG 5
DEBUG 6
S-DEBUG 1
S-DEBUG 1.1 <--- HERE IT IS CRASHING
DEBUG 1
-- ERROR ON SEND
所以据我了解,这里的malloc 功能崩溃了:
char *res = (char *)malloc(3600);
这是我发送的基本信息:
username:password:1.2.3.4:22:Linux:Intel(R) Core(TM)2 Duo CPU E8200 @ 2.77GHz:242 238 3 0 15 64:no_server_load]
有时它会崩溃。
我还更改了char *res = (char *)malloc(3600); 行,原来是char *res = (char *)malloc(1200);。我认为我没有足够的内存空间。
- 问题出在哪里?
- 是否需要重写
my_encode函数使其不再崩溃?如果有,怎么做??
谢谢。
【问题讨论】:
-
你能得到一个核心转储吗?没有它我们只能猜测。
-
您的
for循环中带有strcat(res,switch_encode(buf[i]));看起来非常 错误。我怀疑你正在破坏你的堆,这就是malloc随后失败的原因。 -
@YSC 它是 C++,尽管它看起来像 C ...我的意思是我使用
g++编译它,我该如何进行核心转储?请记住,这是在分叉之后发生的,天知道发生了什么,我看不到它...... -
你确定你在释放
char *res...如果你使用c++你应该使用 -
@PaulR 请解释一下,我不太明白,但错误在
char *res = (char *)malloc(3600);行,最后一个puts是S-DEBUG 1.1,达不到S-DEBUG 1.2,明白吗?