- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我无法弄清楚我的代码的奇怪行为。基本上程序监听一个 tcp 端口,在获得启动/停止命令后,它创建一个 curl 线程并开始下载流。问题是,每次下载流时,程序都会在共享内存中增长。多次下载后,程序停止运行。 - 它接受开始/停止命令,但只下载一小块数据。我假设,有一些内存泄漏。代码:
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#include <arpa/inet.h>
#include <errno.h>
#include <pthread.h>
#include <stdlib.h>
#include <curl/curl.h>
#define MY_PORT 8888
#define MAXBUF 1024
int hour=1,min=1,sec=1,year=0,month=0,mday=0;
int stop=0;
static void daemon();
CURL *curl;
CURLcode res;
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
size_t written;
written = fwrite(ptr, size, nmemb, stream);
if(stop)
return -1;
return written;
}
void * curl_thread(){
FILE *fp;
char format[] = "/root/test/archive_%d-%s-%s_%s.%s.%s.mp3";
char outfilename[sizeof format+100];
char mi[3];
char mth[3];
char dom[3];
char hrs[3];
char secs[3];
sprintf(mth, "%d", month);
sprintf(dom, "%d", mday);
sprintf(hrs, "%d", hour);
sprintf(mi, "%d", min);
sprintf(secs, "%d", sec);
if (month<10){
sprintf(mth, "0%d", month);}
if (mday<10){
sprintf(dom, "0%d", mday); }
if (hour<10){
sprintf(hrs, "0%d", hour); }
if (min<10){
sprintf(mi, "0%d", min);}
if (sec<10){
sprintf(secs, "0%d", sec);}
sprintf(outfilename,format,year,mth,dom,hrs,mi,secs);
curl = curl_easy_init();
if(curl) {
fp = fopen(outfilename,"wb");
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:8000/stream.mp3");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "curl capture");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
fclose(fp);
}
stop=0;
pthread_exit(0);
}
void time_date(void){
time_t rawtime;
time (&rawtime);
struct tm *tm_struct = localtime(&rawtime);
hour = tm_struct->tm_hour;
min = tm_struct->tm_min;
sec= tm_struct->tm_sec;
year=tm_struct->tm_year + 1900;
month=tm_struct->tm_mon + 1;
mday=tm_struct->tm_mday;
}
void daemon(){
pid_t mypid;
FILE *pid;
mypid=fork();
if (mypid){
pid=fopen("acapt.pid","w");
fprintf(pid,"%i",mypid);
exit (0);
}
}
int main(int Count, char *Strings[])
{
daemon();
time_date();
int thread=0;
int sockfd;
struct sockaddr_in self;
char buffer[MAXBUF];
char buff[MAXBUF];
//---Create streaming socket---*/
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
perror("Socket");
exit(errno);
}
///Initialize address/port structure---*/
bzero(&self, sizeof(self));
self.sin_family = AF_INET;
self.sin_port = htons(MY_PORT);
self.sin_addr.s_addr = INADDR_ANY;//*---Assign a port number to the socket---*/
if ( bind(sockfd, (struct sockaddr*)&self, sizeof(self)) != 0 )
{
perror("socket--bind");
exit(errno);
}
///*---Make it a "listening socket"---*/
if ( listen(sockfd, 20) != 0 )
{
perror("socket--listen");
exit(errno);
}
//*---Forever... ---*/
while (1)
{ int clientfd;
struct sockaddr_in client_addr;
int addrlen=sizeof(client_addr);
//*---accept a connection (creating a data pipe)---*/
clientfd = accept(sockfd, (struct sockaddr*)&client_addr,&addrlen);
//*---Echo back anything sent---*/
recv(clientfd, buffer, MAXBUF, 0);
if (strcmp(buffer, "start\r\n")==0&&!thread){
close(clientfd);
sleep(5);
time_date();
pthread_t tid;
pthread_create(&tid,NULL,curl_thread,NULL);
thread=1;
}
if (strcmp(buffer, "stop\r\n")==0&&thread){
close(clientfd);
stop=1;
thread=0;
curl_global_cleanup();
}
memset ( buffer, '\0', MAXBUF );
//*---Close data connection---*/
close(clientfd);
}
//---Clean up (should never get here!)---*/
close(sockfd);
return 0;
}
一次启动/停止后来自 valgrind 的信息:
HEAP SUMMARY:
in use at exit: 4,897 bytes in 58 blocks total heap usage: 2,987 allocs, 2,929 frees, 200,756 bytes allocated 576 bytes in 2 blocks are possibly lost in loss record 16 of 20
at 0x4C272B8: calloc (vg_replace_malloc.c:566)
by 0x401128E: _dl_allocate_tls (dl-tls.c:300)
by 0x4E36483: pthread_create@@GLIBC_2.2.5 (allocatestack.c:580)
by 0x4016A2: main (in /root/test/testas) LEAK SUMMARY:
definitely lost: 0 bytes in 0 blocks
indirectly lost: 0 bytes in 0 blocks
possibly lost: 576 bytes in 2 blocks
still reachable: 4,321 bytes in 56 blocks
suppressed: 0 bytes in 0 blocks
Reachable blocks (those to which a pointer was found) are not shown.
To see them, rerun with: --leak-check=full --show-reachable=yes
For counts of detected and suppressed errors, rerun with: -v
ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 6)
谢谢你的帮助。
最佳答案
这可能不是导致崩溃的原因,但您没有将正确的函数类型传递给 pthread_create()。应该是:
void * curl_thread( void* data )
{
...
您也永远不会加入线程,每次创建新线程时都会泄漏资源。调用 pthread_join() 或 pthread_detach()。
关于C 线程和 curl 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26669599/
IntentReceiver 正在泄漏 由于 onDetachedFromWindow 在某些情况下未被调用。 @Override protected void onDetachedFromWind
好吧,我很难追踪这个内存泄漏。运行此脚本时,我没有看到任何内存泄漏,但我的 objectalloc 正在攀升。 Instruments 指向 CGBitmapContextCreateImage >
我编写了一个测试代码来检查如何使用 Instrument(Leaks)。我创建了一个单一 View 应用程序,单击按钮后我加载了一个像这样的新 View ... - (IBAction)btn_clk
我正在使用这个简单的代码并观察单调增加的内存使用量。我正在使用这个小模块将内容转储到磁盘。我观察到它发生在 unicode 字符串上而不是整数上,我做错了什么吗? 当我这样做时: >>> from u
我有以下泄漏的代码。 Instruments 表示,泄漏的是 rssParser 对象。我“刷新”了 XML 提要,它运行了该 block 并且发生了泄漏...... 文件.h @interface
我在我编写的以下代码片段中发现了内存泄漏 NSFileManager *fileManager=[[NSFileManager alloc] init]; fileList=[[fileManager
因此,我正在开发HTML5 / javascript rts游戏。观察一直有几种声音在播放。因此,对我来说,是一段时间后声音听起来像是“崩溃”,并且此浏览器选项卡上的所有声音都停止了工作。我只能通过重
下面是我正在使用的一段代码及其输出。 my $handle; my $enterCount = Devel::Leak::NoteSV($handle); print "$date entry $en
在这篇关于 go-routines 泄漏的帖子之后,https://www.ardanlabs.com/blog/2018/11/goroutine-leaks-the-forgotten-sende
我想知道为什么在执行 ./a.out 后随机得到以下结果。有什么想法我做错了吗?谢谢 http://img710.imageshack.us/img710/8708/trasht.png 最佳答案 正
我正在 Swift 中开发一个应用程序,在呈现捕获我放在一起的二维码的自定义 ViewController 后,我注意到出现了巨大的内存跳跃。 该代码本质上基于以下示例:http://www.appc
下面是我的 javascript 代码片段。它没有按预期运行,请帮我解决这个问题。 function getCurrentLocation() { console.log("insi
我们在生产环境中部署了 3 个代理 Kafka 0.10.1.0。有些应用程序嵌入了 Kafka Producer,它们将应用程序日志发送到某个主题。该主题有 10 个分区,复制因子为 3。 我们观察
我正在使用仪器来检测一些泄漏,但有一些泄漏我无法解决; NSMutableString *textedetails = [[NSMutableString alloc] init];
如果我使用性能工具测试我的代码 - 泄漏,它没有检测到任何泄漏。这是否意味着代码没有泄漏任何内存? 我有一个越狱的 iPhone,我可以监控可用内存。如果有人知道,那就是 SBSettings。我测试
我在从 AddressBook 中获取图像时遇到了很大的问题,下面我粘贴了我的代码。此 imageData 从未被释放,在我的 Allocations Instruments 上它看起来总是在内存中它
- (NSMutableArray *)getArrayValue:(NSArray *)array{ NSMutableArray *valueArray = [NSMutableArra
Instruments 工具说这是一个泄漏,有什么想法吗? 我在 for 循环结束时释放变量对象 在上述方法的开头,这就是我设置变量对象的方式,即自动释放; NSMutableArray *varia
我正在跟踪我的 iOS 应用程序的内存泄漏,我有一个奇怪的泄漏导致我的应用程序崩溃......负责的框架是:CGImageMergeXMPPropsWhithLegacyProps。在某些时候,我的应
我正在尝试使用 NSOperationQueue 在后台线程中执行一个方法,如下所示: NSOperationQueue *queue = [NSOperationQueue new]; NS
我是一名优秀的程序员,十分优秀!