10

私は c++ を使用して Linux で非常に単純なプログラムを作成しました。このプログラムは、cURL ライブラリを使用して、http 経由で Web サイトから画像をダウンロードします (基本的には 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://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;
}

コードを確認しましたが、正常に動作します。イメージがダウンロードされ、イメージを表示できることを確認できます (エラーや警告なし)。コードを拡張する予定なので、ddd をインストールしてデバッガーを使用しようとしましたが、デバッガーが機能せず、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 の最新バージョンを使用していると思います)

次に、cURLライブラリを含まない別の単純なプログラムでdddを使用しようとしましたが、うまくいきました!!!

なぜこれが当てはまるのか、解決策は何ですか?ddd の実行中に何らかの方法で cURL ライブラリを指す必要がありますか? しかし、過去に、別のライブラリ セットでこれを行ったことを覚えていません! たぶん、ddd が気に入らないのは cURL に関するものでしょうか? しかし、プログラムはデバッガーなしで正常に実行されます! 助けていただければ幸いです。

4

3 に答える 3

22

命令セット検出コードの一部かもしれないと思います。プログラムを続行して、それ自体で信号を処理するかどうかを確認します(外部で実行されるためgdb、おそらく処理します)。gdbまたは、プログラムを実行する前に、SIGILLをまったく気にしないように指示することもできますhandle SIGILL pass nostop noprint

プログラムが死んだ場合にのみ問題になりますが、それはあなたの質問からは明らかではありませんでした。

于 2013-02-28T03:11:30.650 に答える