gdb / ddd编程接收信号SIGILL

我在Linux中使用c ++编写了一个非常简单的程序,它使用cURL库从http下载某个网站的图像(基本上开发了一个http客户机请求)。 http://curl.haxx.se/libcurl/c/allfuncs.html

#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://img.zgserver.com/linux/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; } 

我validation了代码,它工作正常。 我可以看到图像已下载,并可以查看图像(没有错误或警告)。 由于我打算扩展我的代码,我尝试安装ddd,并使用debugging器,但debugging器不起作用,当我尝试使用ddd运行我的程序时,程序退出时出现某种信号错误。

这是错误的:

  (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 

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

然后我试图在另一个简单的程序上使用ddd,这不涉及cURL库,它工作得很好!

有没有人知道为什么这样,什么是解决scheme? 我是否需要在ddd运行时指向cURL库? 但是,过去,我不记得使用不同的库来做这件事情! 也许这是ddd不喜欢的cURL的东西吗? 但程序运行良好,没有debugging器! 我将不胜感激一些帮助。

Solutions Collecting From Web of "gdb / ddd编程接收信号SIGILL"

我猜测它可能是一些指令集检测代码的一部分。 只要让程序继续,看看它是否自己处理信号(因为它运行在gdb之外,它可能会)。 或者,在运行程序之前,您可以告诉gdb完全不用SIGILL来打扰您: handle SIGILL pass nostop noprint

如果程序死了,这只是一个问题,这个问题并不清楚。

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

有没有人知道为什么这样,什么是解决方案?

杰斯特给了你解决方案。 这是它发生的原因。

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 free特性检测,因为苹果公司破坏了一切。 另请参阅PR 3108,MacOS X上的无SIGILL处理器功能检测 。 其他图书馆正在做类似的。 另请参阅如何在运行时确定ARMv8功能?

OpenSSL还在其常见问题解答中记录了SIGILL行为。 有关更多详细信息,请参阅OpenSSL FAQ中的第17项: 调试时,我在OpenSSL初始化过程中观察到SIGILL:为什么? 另请参阅在堆栈溢出中在gdb下运行时,SSL_library_init会导致SIGILL 。