我正在学习在Debian 12上使用libwget.我已经安装了"wget2-dev"包,它递归地安装了"libwget0"包.我在wget2 examples的帮助下写了一个非常基本和简单的应用程序.

#include <stdio.h>
#include <stdlib.h>
#include <wget.h>

int main(int argc, char *argv[])
{
    wget_http_connection_t *conn = NULL;
    wget_http_response_t *resp;

    // set up libwget global configuration
    wget_global_init(
        WGET_COOKIES_ENABLED, 1,
        WGET_COOKIE_SUFFIXES, "public_suffixes.txt",
        WGET_COOKIE_FILE, "cookies.txt",
        WGET_COOKIE_KEEPSESSIONCOOKIES, 1,
        0);

    // execute an HTTP GET request and return the response
    resp = wget_http_get(
        WGET_HTTP_URL, "http://example.com",
        WGET_HTTP_MAX_REDIRECTIONS, 5,
        WGET_HTTP_CONNECTION_PTR, &conn,
        0);

    if (resp)
    {
        printf("%s", resp->body->data);

        // free the response
        wget_http_free_response(&resp);
    }
    // close connection if still open
    wget_http_close(&conn);
    // free resources - needed for valgrind testing
    wget_global_deinit();

    return EXIT_SUCCESS;
}

我的问题是,在调用wget_global_init函数时,如果我将"WGET_COOKIES_ENABLED"设置为"1",我就会得到一个分段错误.

这里出了什么问题?是因为图书馆的事,还是我做错了什么?谢谢.

编辑:我在另一个与分段故障相关的question个问题上try 了答案.如果我输入

gdb ./MyApp

我得到

(gdb) run
Starting program: MyApp 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
___pthread_mutex_lock (mutex=0x0) at ./nptl/pthread_mutex_lock.c:80
80  ./nptl/pthread_mutex_lock.c: No such file or directory.

那是什么意思?我怎么才能解决它呢?

编辑2:如果我键入

valgrind --leak-check=full ./MyApp

我得到

==42170== Invalid read of size 4
==42170==    at 0x49541C0: pthread_mutex_lock@@GLIBC_2.2.5 (pthread_mutex_lock.c:80)
==42170==    by 0x487A7EC: wget_cookie_create_request_header (in /usr/lib/libwget.so.0.0.0)
==42170==    by 0x4895153: wget_http_get (in /usr/lib/libwget.so.0.0.0)
==42170==    by 0x1091EE: main (main.c:23)
==42170==  Address 0x10 is not stack'd, malloc'd or (recently) free'd
==42170== 
==42170== 
==42170== Process terminating with default action of signal 11 (SIGSEGV)
==42170==  Access not within mapped region at address 0x10
==42170==    at 0x49541C0: pthread_mutex_lock@@GLIBC_2.2.5 (pthread_mutex_lock.c:80)
==42170==    by 0x487A7EC: wget_cookie_create_request_header (in /usr/lib/libwget.so.0.0.0)
==42170==    by 0x4895153: wget_http_get (in /usr/lib/libwget.so.0.0.0)
==42170==    by 0x1091EE: main (main.c:23)

这是一个错误,还是我没有正确地使用库?

编辑3:在Olaf Dietsche的注释之后,我在Eclipse CDT中添加了-pthread来构建设置

Invoking: GCC C Compiler
gcc -pthread -I/usr/include -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/main.d" -MT"src/main.o" -o "src/main.o" "../src/main.c"
Invoking: GCC C Linker
gcc -pthread -L/usr/lib -o "MyApp" ./src/main.o    -lwget

当我运行程序时,我仍然收到相同的错误.

编辑4:在Olaf Dietsche条 comments 之后,我也添加了-pthread条GCC链接选项.而且我仍然有分段故障.

推荐答案

  1. 这是库(D51398947e150e930299f3c9657aaf6204489f4d)中的一个错误,其中wget_global_get_ptr()返回&_config.cookie_db,而调用者wget_http_get()期望_config.cookie_db.此修复程序在2.0.0版中提供,Debian的当前版本是1.99.1-2.2.

    @rockdboot提到它在Debian测试中被修复了,所以你可以install that package from testing.

  2. 一旦获得了库的固定版本,您可能希望指定WGET_COOKIE_FILE,这将设置WGET_COOKIES_ENABLED.

请向Debian提交针对包libwget0的错误报告.

额外的好处:事实证明wget(二进制)并不依赖于libwget0.

C++相关问答推荐

C中的ATONE会扰乱SEN/CLUTE GMS应用程序中的其他字符串

如何将FileFilter添加到FileDialog GTK 4

POSIX文件描述符位置

显式地将值转换为它从函数返回的类型的含义是什么?

为什么C语言允许你使用var =(struct NAME){

ESP32在vTaskDelay上崩溃

Clang:如何强制运行时错误的崩溃/异常由于-fsanitize=undefined

用C宏替换strncMP函数中的参数

Sizeof(&Q;字符串&Q;)的正确输出是什么?

如何在VSCode中创建和使用我自己的C库?

将非连续物理内存映射到用户空间

try 查找带有指针的数组的最小值和最大值

c程序,让用户输入两类数字,并给出输出用户输入多少个数字

unions 的原子成员是个好主意吗?

在C中打印指针本身

gdb - 你能找到持有内部 glibc 锁的线程吗?

变量的指针右对齐,函数的指针左对齐

是否可以在多字 C 类型中的任何位置混合存储和类型限定符?

多行表达式:C 编译器如何处理换行符?

比 * 更快的乘法