Skip to content

PutObject make software crash #4834

@SagitariiHunter

Description

@SagitariiHunter

Expected behavior

我希望使用aws sdk for c++的PutObject函数上传一个指定了绝对路径的文件(localfile),这个上传函数被用aarch64编译后放在一个64位的控制器上运行。

Actual behavior

程序运行到上传函数时会输出堆栈信息,程序并未挂掉因此未产生core文件,具体堆栈信息贴在下方。
请注意我是参考的示例代码来写的上传函数,示例代码链接(https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/cpp/example_code/s3/put_object.cpp)

Steps to reproduce

1.仅仅运行代码
2.
3.

Logs / stacktrace (if applicable)

node: malloc.c:2379: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
*** Aborted at 1685064095 (unix time) try "date -d @1685064095" if you are using GNU date ***
PC: @                0x0 (unknown)
*** SIGABRT (@0x70a) received by PID 1802 (TID 0xffff40787a70) from PID 1802; stack trace: ***
    @     0xffffa0c2b328 google::(anonymous namespace)::FailureSignalHandler()
    @     0xffffa20305b8 ([vdso]+0x5b7)
    @     0xffffa0423330 gsignal
    @     0xffffa0410b54 abort
    @     0xffffa0462130 (unknown)
    @     0xffffa04645b8 (unknown)
    @     0xffffa0465398 (unknown)
    @     0xffffa0466324 __libc_malloc
    @     0xffffa071d8cc operator new()
    @     0xffff6e16a3f0 Aws::Utils::StringUtils::RTrim()
    @     0xffff6e16a534 Aws::Utils::StringUtils::Trim()
    @     0xffff6e0f6bd8 Aws::Http::Standard::StandardHttpRequest::SetHeaderValue()
    @     0xffff6e11905c Aws::Client::AWSAuthV4Signer::SignRequest()
    @     0xffff6e107614 Aws::Client::AWSClient::AttemptOneRequest()
    @     0xffff6e10ea64 Aws::Client::AWSClient::AttemptExhaustively()
    @     0xffff6e110ac0 Aws::Client::AWSXMLClient::MakeRequest()
    @     0xffff6e111000 Aws::Client::AWSXMLClient::MakeRequest()
    @     0xffff61be65d8 Aws::S3::S3Client::PutObject()
    @     0xffff94683130 haomo::data_collect::AwsS3Operate::uploadFile()
    @     0xffff9c24d4f8 _ZNSt17_Function_handlerIFSt10unique_ptrINSt13__future_base12_Result_baseENS2_8_DeleterEEvENS1_12_Task_setterIS0_INS1_7_ResultIbEES3_EZNS1_11_Task_stateISt5_BindIFSB_IFMN5haomo12data_collect12AwsS3OperateEFbNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESK_SK_SK_RSt10shared_ptrINSC_3v2x3V2XEEbEPSE_SK_SK_SK_SK_St17reference_wrapperISO_EbEEvEESaIiEFbvEE6_M_runEvEUlvE_bEEE9_M_invokeERKSt9_Any_data
    @     0xffffa1f00674 std::__future_base::_State_baseV2::_M_do_set()
    @     0xffffa0fafc50 __pthread_once_slow

上传函数如下:
bool AwsS3Operate::uploadFile(std::string viaSTS, std::string bucketName, std::string objectName, std::string localFile, std::shared_ptr<haomo::v2x::V2X>& collector_v2x,  bool continue_upload) {
    // LocalFilename由本地文件路径加文件名包括后缀组成
    MLOG(dtcl, ERROR) << "upload file path is " << localFile;
    bool result = true;
    if(!exists_file(localFile)) {
        MLOG(dtcl, ERROR) << "the file is not exist " << localFile;
       result = false;
    }else{
        // 初始化AWS客户端
        Aws::Client::ClientConfiguration clientConfig;
        // clientConfig.useDualStack = true;
        clientConfig.region = "eu-central-1";
        clientConfig.endpointOverride = "s3.dualstack.eu-central-1.amazonaws.com";
        Aws::Auth::AWSCredentials credentials(m_accessKeyId, m_accessKeySecret, m_security_token);
        Aws::S3::S3Client s3_client(credentials, Aws::MakeShared<Aws::S3::Endpoint::S3EndpointProvider>(""), clientConfig);
        
        Aws::S3::Model::PutObjectRequest request;
        request.SetBucket(bucketName);
        request.SetKey(objectName);
        std::shared_ptr<Aws::IOStream> inputData = Aws::MakeShared<Aws::FStream>("",
                                          localFile.c_str(),
                                          std::ios_base::in | std::ios_base::binary);
        if (!*inputData) {
            MLOG(dtcl, ERROR) << "Error unable to read file " << localFile;
            return false;
        }
        request.SetBody(inputData);
        if (viaSTS == "sts") {
            auto put_object_outcome = s3_client.PutObject(request);
            // 异常处理
            if (!put_object_outcome.IsSuccess()) {
                MLOG(dtcl, ERROR) << "PutObject fail: " << objectName << ", message: " << put_object_outcome.GetError().GetMessage();
        }
    }
    return result;
}

Which SDK were you using?

C++

Which OS were you using?

Linux

SDK version

maybe 1.11.66, more or less

OS version

cat /etc/os-release: NAME=Buildroot VERSION=-g73ffddb4 ID=buildroot VERSION_ID=2020.11.2 PRETTY_NAME="Buildroot 2020.11.2"

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions