【发布时间】:2019-07-23 06:05:16
【问题描述】:
我有一个在 Visual Studio 2017 中创建的 .dll c++ 项目。其中有使用 aws sdk 从 s3 存储桶获取文件的代码。
我在调试模式模式下构建了这个 dll 项目,并将它用于我的主应用程序(c++ 也是)。它奏效了。
现在我确实对 dll 项目和我的主应用程序进行了发布构建。我的应用程序在执行“aws sdk c++”代码时崩溃。
这是关于 aws sdk c++ 的代码 sn-p:
int Download()
{
Aws::SDKOptions options;
Aws::InitAPI(options);
{
const Aws::String bucket_name = "timestamp-storage";
//Aws::String key_name = "";
const Aws::String region = "ap-northeast-1";
std::map<int, std::string> uploadedBioMap = BiometricDB::List();
std::map<int, std::string>::iterator i;
for (i = uploadedBioMap.begin(); i != uploadedBioMap.end(); i++) {
Aws::String key_name = i->second;
std::cout << "Downloading " << key_name << " from S3 bucket: " <<
bucket_name << std::endl;
Aws::Client::ClientConfiguration clientConfig;
if (!region.empty())
clientConfig.region = region;
Aws::S3::S3Client s3_client(clientConfig);
Aws::S3::Model::GetObjectRequest object_request;
object_request.WithBucket(bucket_name).WithKey(key_name);
auto get_object_outcome = s3_client.GetObject(object_request);
if (get_object_outcome.IsSuccess())
{
Aws::OFStream local_file;
local_file.open(("enroll/" + key_name).c_str(), std::ios::out | std::ios::binary);
local_file << get_object_outcome.GetResult().GetBody().rdbuf();
std::cout << "Done!" << std::endl;
}
else
{
std::cout << "GetObject error: " <<
get_object_outcome.GetError().GetExceptionName() << " " <<
get_object_outcome.GetError().GetMessage() << std::endl;
}
}
}
Aws::ShutdownAPI(options);
return 1;
}
希望有人可以帮助我。
【问题讨论】:
-
如果某些东西在调试版本中工作但在发布中崩溃(或在发布中工作但在调试中崩溃)通常是未定义行为的标志。如果您使用调试信息构建“发布”版本,它是否也会崩溃?如果是这样,您能否在崩溃发生时进入调试器找到它,并在此时检查涉及的变量?
-
只是在这里做个猜测:你有在“发布模式”中构建的 aws c++ sdk 库吗?可能库/依赖项是在调试模式下构建的,因此它们在调试模式下工作,因此需要库的发布模式构建才能使其在发布模式下工作。
-
我调试了发布的版本,它显示了有错误的文件,“iosfwd”文件带有关于(vcruntime140.dll)的异常抛出消息:访问冲突写入位置
-
崩溃发生在你的代码的什么地方?请沿着函数调用堆栈向上走,直到你成为你的代码。
-
执行完这行代码“clientConfig.region = region;”后就停止了。我认为这就是错误发生的地方。
标签: c++ dll aws-sdk-cpp release-builds