以下代码片段是我使用Android NDK编译的代码片段。从Java我传递一个文件夹来写一个文件。我试图从Java和C ++(虽然一次)执行mkdir
并获得相同的结果。在下面的代码片段中,我正在用C ++创建文件夹。
int statusMKDIR = mkdir(folderToWrite, 0755);
LOGD(string("status mkdir: " + to_string(statusMKDIR)).c_str()); // this is always -1
CURL *curl;
FILE *fp;
CURLcode res;
string outfilename = string(folderToWrite+string("/file.zip"));
curl = curl_easy_init();
if (curl) {
fp = fopen(outfilename.c_str(),"wb");
// header
struct curl_slist *chunk = NULL;
chunk = curl_slist_append(chunk, "append");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
// end header
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
if (fp)
LOGD("fp exists");
else {
LOGD("we're gonna craaaaaaaaaash"); // here is what it prints when it throws the Fatal Signal 11
}
res = curl_easy_perform(curl);
std::ostringstream out;
out << res;
string content = out.str();
curl_easy_cleanup(curl);
fclose(fp);
}
所以,这只发生在 SOMETIMES 。我认为文件夹没有发布。我认为这可能有用:
if (fp)
LOGD("fp exists");
else {
while (!fp) {
fp = fopen(outfilename.c_str(),"wb");
}
}
size_t write_data(void * ptr,size_t size,size_t nmemb,FILE * stream){ LOGD( “书面方式”); size_t write = 0; if(size&gt; 0&amp;&amp; nmemb&gt; 0){ written = fwrite(ptr,size,nmemb,stream); } LOGD(“结束写作”); //当它有时崩溃时,它没有达到这一点。 归还; }
但这会以无限循环结束。
我该怎么调试呢?因为有时我可以写,有些我不能写。我无法重现为什么有时它不起作用。
我的堆栈跟踪是:
A / libc:致命信号11(SIGSEGV),代码1,故障地址0x30 in tid 29956(AsyncTask#2)
非常感谢。