gpt4 book ai didi

c - 为什么 libcurl 在调用 curl_easy_perform() 时出现段错误?

转载 作者:太空宇宙 更新时间:2023-11-04 05:57:27 27 4
gpt4 key购买 nike

在我为网站负载测试而编写的 HTTP flooder 中使用 libCURL 时,我遇到了段错误。

这里是相关代码:https://gist.github.com/AppleDash/a26e0ce0b138cd9eacd2 (粘贴在这里有点大。)

这是一个链接到它发生段错误的行:https://gist.github.com/AppleDash/a26e0ce0b138cd9eacd2#file-httpflood-improved-c-L57

这是段错误的回溯:

#0  0x00007ffff760d65b in fwrite () from /usr/lib/libc.so.6
#1 0x00007ffff79656d8 in ?? () from /usr/lib/libcurl.so.4
#2 0x00007ffff797a76b in ?? () from /usr/lib/libcurl.so.4
#3 0x00007ffff7984349 in ?? () from /usr/lib/libcurl.so.4
#4 0x00007ffff7984b11 in curl_multi_perform () from /usr/lib/libcurl.so.4
#5 0x00007ffff797b977 in curl_easy_perform () from /usr/lib/libcurl.so.4
#6 0x0000000000400f42 in flood (structPointer=0x7fffffffe060) at httpflood.c:57
#7 0x00007ffff7bc5124 in start_thread () from /usr/lib/libpthread.so.0
#8 0x00007ffff768b4bd in clone () from /usr/lib/libc.so.6

我不明白为什么这个调用会导致段错误。有什么想法吗?

我知道您只打算提供相关代码的一小部分示例,但由于我觉得这里需要上下文,所以我在这里提供了全部内容。 (事实上​​它是从许多线程等运行的。)

最佳答案

这是你的问题:

for (i = 0; i < threadnum; i++) {
struct flood_data ddosData;
memset(&ddosData, 0, sizeof(struct flood_data));
ddosData.url = url;
ddosData.proxy = getProxy();
pthread_create(&threads[i], NULL, flood, (void *)&ddosData);
}

您正在堆栈上分配一个struct flood_data 实例,并将其同时传递给所有新线程。每次迭代循环时,您都会同时覆盖同一实例,而从较早迭代中产生的线程可能会尝试从中读取。主要未定义行为。

正确的做法是为每个线程动态分配一个单独的实例:

for (i = 0; i < threadnum; i++) {
struct flood_data *ddosData = calloc(1, sizeof(*ddosData));
ddosData->url = url;
ddosData->proxy = getProxy();
pthread_create(&threads[i], NULL, flood, ddosData);
}

...

void *flood(void *structPointer) {
struct flood_data *data = structPointer;
char *bootable = data->url;
char *proxy = data->proxy;
free(data);
...
}

正如评论中所指出的,您还需要检查您的系统调用是否失败。您应该验证对 fopen() 的所有调用是否成功,因为您很可能会达到进程中打开的文件描述符的最大数量。与其将文件打开到 /dev/null,不如使用 CURLOPT_WRITEFUNCTION 设置一个空操作写入函数?选项?

static size_t noop_write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
// Do nothing
return size * nmemb;
}

...

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &noop_write_callback);
// No need to call fopen("/dev/null") or set CURLOPT_WRITEDATA now

关于c - 为什么 libcurl 在调用 curl_easy_perform() 时出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24746296/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com