gdb/ddd程序接收信号SIGILL 我在Linux中用C++编写了一个非常简单的程序,它通过HTCL(HTTP客户端请求),从一些网站上下载图像,使用CURL库。p>

gdb/ddd程序接收信号SIGILL 我在Linux中用C++编写了一个非常简单的程序,它通过HTCL(HTTP客户端请求),从一些网站上下载图像,使用CURL库。p>,linux,gdb,libcurl,raspberry-pi,ddd-debugger,Linux,Gdb,Libcurl,Raspberry Pi,Ddd Debugger,首先,我认为我没有正确安装ddd,所以我回到gdb,但当我运行程序时,我得到了完全相同的错误。(我相信我使用的是最新版本的gdb和ddd) 然后我试着在另一个简单的程序上使用ddd,它不涉及旋度库,而且运行良好 有人知道为什么会这样吗?解决办法是什么?我是否需要在ddd运行时指向cURL库?但是,在过去,我不记得对不同的库集执行过此操作!也许这是ddd不喜欢的卷发?但是没有调试器,程序本身运行良好!我想这可能是一些指令集检测代码的一部分。只要让程序继续运行,看看它是否自己处理信号(因为它在gdb

首先,我认为我没有正确安装ddd,所以我回到gdb,但当我运行程序时,我得到了完全相同的错误。(我相信我使用的是最新版本的gdb和ddd)

然后我试着在另一个简单的程序上使用ddd,它不涉及旋度库,而且运行良好


有人知道为什么会这样吗?解决办法是什么?我是否需要在ddd运行时指向cURL库?但是,在过去,我不记得对不同的库集执行过此操作!也许这是ddd不喜欢的卷发?但是没有调试器,程序本身运行良好!我想这可能是一些指令集检测代码的一部分。只要让程序继续运行,看看它是否自己处理信号(因为它在
gdb
之外运行,它可能会处理)。或者,在运行程序之前,您可以告诉
gdb
不要用SIGILL打扰您:
handle SIGILL pass nostop noprint

这只是一个问题,如果程序死了,这是不清楚从你的问题

有人知道为什么会这样吗?解决办法是什么

杰斯特给了你答案。这就是它发生的原因

libcrypto.so
是OpenSSL的加密库。OpenSSL通过执行一条指令来执行cpu功能探测,以查看其是否可用。如果生成了
SIGILL
,则该功能不可用,而是使用了相应的功能

在ARM而不是IA-32上看到它们的原因是,在Intel的IA-32上,
cpuid
指令是非特权指令。任何程序都可以执行
cpuid
来检测cpu功能,因此不需要基于
SIGILL
的功能程序

与IA-32不同,ARM的
cpuid
等价物是一条特权指令。您的程序需要异常级别1(EL-1),但您的程序以EL-0运行。要避开ARM程序对特权的需要,请设置
jmpbuf
并安装
SIGILL
处理程序。然后,他们尝试有问题的指令,
SIGILL
处理程序指示指令或功能是否可用

OpenSSL最近在一些苹果平台上改用了
SIGILL
-免费功能检测,因为苹果破坏了东西。另见。其他图书馆也在做类似的事情。也看到


OpenSSL还在常见问题解答中记录了
SIGILL
行为。有关更多详细信息,请参见OpenSSL常见问题解答中的第17项:另请参见关于堆栈溢出的内容。

只是说:我是带着同样的错误来到这里的。我的解决方案是恢复到
gdb7.6.1
(从gdb7.7开始)。可能重复
#define CURL_STATICLIB
#include <stdio.h>
#include <stdlib.h>
#include </usr/include/curl/curl.h>
#include </usr/include/curl/stdcheaders.h>
#include </usr/include/curl/easy.h>

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
    size_t written = fwrite(ptr, size, nmemb, stream);
    return written;
}

int main(void) {
    CURL *curl;
    FILE *fp;
    CURLcode res;

    char *url = "http://www.example.com/test_img.png"; 
    char outfilename[FILENAME_MAX] = "/home/c++_proj/output/web_req_img.png";
    curl = curl_easy_init();
    if (curl) {
        fp = fopen(outfilename,"wb");
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);
        /* always cleanup */
        curl_easy_cleanup(curl);
        fclose(fp);
    }
    return 0;
}
 (Threadd debugging using libthread_db enabled)
 Using host libthread_db library "/lib/arm-linux-gnueadihf/libthread_db.so.1"

 Program received signal SIGILL, illegal instruction.
 0xb6a5c4C0 in ?? () from /usr/lib/arm-linux-gnueadbihf/libcrypto.so.1.0.0
 Program received signal SIGILL, illegal instruction.
 0xb6a5c4C0 in ?? () from /usr/lib/arm-linux-gnueadbihf/libcrypto.so.1.0.0