首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ -分段故障。- malloc.c:没有这样的文件或目录

C++ -分段故障。- malloc.c:没有这样的文件或目录
EN

Stack Overflow用户
提问于 2020-09-25 01:26:09
回答 2查看 525关注 0票数 0

下面是我的GDB Stacktrace:

代码语言:javascript
运行
复制
Program received signal SIGSEGV, Segmentation fault.
__GI___libc_free (mem=0x4645444342414746) at malloc.c:3102
3102    malloc.c: No such file or directory.
(gdb) bt
#0  __GI___libc_free (mem=0x4645444342414746) at malloc.c:3102
#1  0x00005555555b7e22 in __gnu_cxx::new_allocator<char>::deallocate (this=0x55555562d0c0, __p=0x4645444342414746 <error: Cannot access memory at address 0x4645444342414746>) at /usr/include/c++/9/ext/new_allocator.h:128
#2  0x00005555555b51ec in std::allocator_traits<std::allocator<char> >::deallocate (__a=..., __p=0x4645444342414746 <error: Cannot access memory at address 0x4645444342414746>, __n=18087021261120207611) at /usr/include/c++/9/bits/alloc_traits.h:470
#3  0x00007ffff7f93a72 in std::_Vector_base<char, std::allocator<char> >::_M_deallocate (this=0x55555562d0c0, __p=0x4645444342414746 <error: Cannot access memory at address 0x4645444342414746>, __n=18087021261120207611) at /usr/include/c++/9/bits/stl_vector.h:351
#4  0x00007ffff7f9275a in std::_Vector_base<char, std::allocator<char> >::~_Vector_base (this=0x55555562d0c0, __in_chrg=<optimized out>) at /usr/include/c++/9/bits/stl_vector.h:332
#5  0x00007ffff7f9175f in std::vector<char, std::allocator<char> >::~vector (this=0x55555562d0c0 = {...}, __in_chrg=<optimized out>) at /usr/include/c++/9/bits/stl_vector.h:680
#6  0x00007ffff7f97282 in boost::asio::basic_streambuf<std::allocator<char> >::~basic_streambuf (this=0x55555562d078, __in_chrg=<optimized out>) at /usr/include/boost/asio/basic_streambuf.hpp:111
#7  0x00007ffff7f90652 in Packet::~Packet (this=0x55555562d068, __in_chrg=<optimized out>) at /home/armegon/Vibranium-Core/Source/Common/Server/Packet.h:16
#8  0x00007ffff7f9816c in Vibranium::Client::~Client (this=0x55555562d020, __in_chrg=<optimized out>) at /home/armegon/Vibranium-Core/Source/Common/Server/Client.h:19
#9  0x00007ffff7f981ac in __gnu_cxx::new_allocator<Vibranium::Client>::destroy<Vibranium::Client> (this=0x55555562d020, __p=0x55555562d020) at /usr/include/c++/9/ext/new_allocator.h:153
#10 0x00007ffff7f97c05 in std::allocator_traits<std::allocator<Vibranium::Client> >::destroy<Vibranium::Client> (__a=..., __p=0x55555562d020) at /usr/include/c++/9/bits/alloc_traits.h:497
#11 0x00007ffff7f9745b in std::_Sp_counted_ptr_inplace<Vibranium::Client, std::allocator<Vibranium::Client>, (__gnu_cxx::_Lock_policy)2>::_M_dispose (this=0x55555562d010) at /usr/include/c++/9/bits/shared_ptr_base.h:557
#12 0x00005555555b373c in std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release (this=0x55555562d010) at /usr/include/c++/9/bits/shared_ptr_base.h:155
#13 0x00005555555b1575 in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count (this=0x7fffffffdfe8, __in_chrg=<optimized out>) at /usr/include/c++/9/bits/shared_ptr_base.h:730
#14 0x00007ffff7f90706 in std::__shared_ptr<Vibranium::Client, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr (this=0x7fffffffdfe0, __in_chrg=<optimized out>) at /usr/include/c++/9/bits/shared_ptr_base.h:1169
#15 0x00007ffff7f90726 in std::shared_ptr<Vibranium::Client>::~shared_ptr (this=0x7fffffffdfe0 = {...}, __in_chrg=<optimized out>) at /usr/include/c++/9/bits/shared_ptr.h:103
#16 0x00007ffff7f98e6e in Vibranium::Client::<lambda(boost::system::error_code, std::size_t)>::~<lambda>(void) (this=0x7fffffffdfd8, __in_chrg=<optimized out>) at /home/armegon/Vibranium-Core/Source/Common/Server/Client.cpp:35
#17 0x00007ffff7f997f2 in boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::executor>, boost::asio::mutable_buffers_1, const boost::asio::mutable_buffer*, boost::asio::detail::transfer_all_t, Vibranium::Client::read_size()::<lambda(boost::system::error_code, std::size_t)> >::~read_op(void) (this=0x7fffffffdfb0, __in_chrg=<optimized out>) at /usr/include/boost/asio/impl/read.hpp:317
#18 0x00007ffff7f9aa38 in boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::executor>, boost::asio::mutable_buffers_1, const boost::asio::mutable_buffer*, boost::asio::detail::transfer_all_t, Vibranium::Client::read_size()::<lambda(boost::system::error_code, std::size_t)> >, boost::system::error_code, long unsigned int>::~binder2(void) (this=0x7fffffffdfb0, __in_chrg=<optimized out>) at /usr/include/boost/asio/detail/bind_handler.hpp:127
#19 0x00007ffff7f9ab87 in boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffers_1, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::executor>, boost::asio::mutable_buffers_1, const boost::asio::mutable_buffer*, boost::asio::detail::transfer_all_t, Vibranium::Client::read_size()::<lambda(boost::system::error_code, std::size_t)> >, boost::asio::detail::io_object_executor<boost::asio::executor> >::do_complete(void *, boost::asio::detail::operation *, const boost::system::error_code &, std::size_t) (owner=0x55555563e380, base=0x555555631a60) at /usr/include/boost/asio/detail/reactive_socket_recv_op.hpp:114
#20 0x00005555555aa984 in boost::asio::detail::scheduler_operation::complete (this=0x555555631a60, owner=0x55555563e380, ec=..., bytes_transferred=0) at /usr/include/boost/asio/detail/scheduler_operation.hpp:40
#21 0x00005555555af30e in boost::asio::detail::scheduler::do_run_one (this=0x55555563e380, lock=..., this_thread=..., ec=...) at /usr/include/boost/asio/detail/impl/scheduler.ipp:447
#22 0x00005555555aed1a in boost::asio::detail::scheduler::run (this=0x55555563e380, ec=...) at /usr/include/boost/asio/detail/impl/scheduler.ipp:200
#23 0x00005555555af86c in boost::asio::io_context::run (this=0x7fffffffe1f0) at /usr/include/boost/asio/impl/io_context.ipp:63
#24 0x00005555555a7795 in main () at /home/armegon/Vibranium-Core/Source/Core/AuthServer/AuthServer.cpp:34
#25 0x00007ffff74cd0b3 in __libc_start_main (main=0x5555555a74e8 <main()>, argc=1, argv=0x7fffffffe518, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe508) at ../csu/libc-start.c:308
#26 0x00005555555a740e in _start ()

这里我只提供堆栈跟踪中提到的代码:

Packet.h

代码语言:javascript
运行
复制
class Packet { //Packet.h 16
public:
    Packet()
    {
    }
    static const int header_size_in_bytes = 4;
    uint8_t size[header_size_in_bytes] = {0};
    size_t body_size{0};
    boost::asio::streambuf body_;
    void PreparePacket(ServerOpcode serverOpcode, std::string message);
};


#endif //VIBRANIUM_CORE_PACKET_H

Packet.cpp

代码语言:javascript
运行
复制
void Packet::PreparePacket(ServerOpcode serverOpcode, std::string message) {
}

Client.h

代码语言:javascript
运行
复制
using boost::asio::ip::tcp;

namespace Vibranium{
    class Client: public std::enable_shared_from_this<Client> // Client.h 19
    {
    public:
        Client(tcp::socket socket)
        : socket(std::move(socket))
        {
        }
        void start();
        int connectionId;
        tcp::socket socket;
        void Send(ServerOpcode serverOpcode, const std::string& message);
        void Disconnect() const;
    private:
        void read_size();
        void read_message();
        Packet _packet;
    };
}
#endif //VIBRANIUM_CORE_CLIENT_H

Client.cpp

代码语言:javascript
运行
复制
using namespace Vibranium;

void Vibranium::Client::start() {
    read_size();
}

void Vibranium::Client::Send(ServerOpcode serverOpcode, const std::string& message) {
}

void Vibranium::Client::read_size() {
    auto self(shared_from_this());
    boost::asio::async_read(socket,
    boost::asio::buffer(&_packet.size, _packet.header_size_in_bytes),
    [this, self](boost::system::error_code ec,std::size_t bytes_transferred) //Client.cpp 35
    {
        if ((boost::asio::error::eof == ec) || (boost::asio::error::connection_reset == ec))
        {
            Disconnect();
        }
        else
        {
            _packet.body_size = static_cast<int>(_packet.size[0]);
            read_message();
        }
    });
}


void Vibranium::Client::read_message() {
    auto self(shared_from_this());
    _packet.body_.prepare(_packet.body_size);
    boost::asio::async_read(socket,
    boost::asio::buffer(&_packet.body_, _packet.body_size),
    [this, self](boost::system::error_code ec,std::size_t bytes_transferred)
    {
        if ((boost::asio::error::eof == ec) || (boost::asio::error::connection_reset == ec))
        {
            Disconnect();
        }
        else
        {

            const char *HEADER = "ABVG";
            const char* buffIdentifier = flatbuffers::GetBufferIdentifier(&_packet.body_);
            bool hasIdentifier = flatbuffers::BufferHasIdentifier(&_packet.body_,HEADER);

            std::cout << "Builder Identifier" << buffIdentifier << std::endl;
            std::cout << "Builder Has Identifier" << hasIdentifier << std::endl;
            auto ac = GetAccountRole_Packet(&_packet.body_);
            std::cout << "ID" << ac->id() << std::endl;
            std::cout << "NAME:" << ac->name()->c_str() << std::endl;
            read_size();
        }
    });
}


void Vibranium::Client::Disconnect() const {
    Logger::Log("Disconnected ID: " + std::__cxx11::to_string(this->connectionId), Logger::Error, true);
    for (int i = 0; i < Vibranium::Server::Clients.size(); ++i) {
        if(Vibranium::Server::Clients[i]->connectionId == this->connectionId)
            Vibranium::Server::Clients.erase(Vibranium::Server::Clients.begin() + i);
    }
}

AuthServer.cpp

代码语言:javascript
运行
复制
#include "Config.h"
#include "Database/MySQLConnection.h"
#include "Implementation/LoginDatabase.h"
#include "Banner.h"
#include "Server/Server.h"
#include <boost/asio.hpp>

using boost::asio::ip::tcp;
using namespace std;
using namespace Vibranium;

int main() {
    //Don't mind Logger::FatalError it's just for coloring!
    Banner::Show(Logger::Error,"AuthServer");
    Config config("AuthServer");
    std::string defaultPort = "8080";
    MySQLConnectionInfo mySqlConnectionInfo(config, "LoginDatabaseInfo");
    LoginDatabaseConnection loginDatabaseConnection(mySqlConnectionInfo);
    loginDatabaseConnection.LoadDatabase();

    try
    {
        boost::asio::io_service io_service;
        Server s(io_service, std::stoi(config.GetConfigValue("AuthServerPort", defaultPort)));
        io_service.run(); // <---- LINE 34 is HERE 
    }
    catch (std::exception& e)
    {
        std::cerr << "Exception: " << e.what() << "\n";
    }

    return 0;
}

我对C++和GDB还是个新手。我想知道是什么导致了这次坠机。我的错误在哪里?我如何才能纠正它?

附注。这可能很重要,所以我添加了如何向服务器发送消息以及崩溃发生的原因:

代码语言:javascript
运行
复制
flatbuffers::FlatBufferBuilder builder;
std::string str = "ABCDEFGABCDEFGABCDEFGABCDEFGABCDEFG I AM HERE!";
auto name = builder.CreateString(str);
auto accountRole = Vibranium::CreateAccountRole_Packet(builder,5,name);
const char *HEADER = "ABVG";
builder.FinishSizePrefixed(accountRole, HEADER);
size_t size = builder.GetSize();
uint8_t *buf = builder.GetBufferPointer();
const char* buffIdentifier = flatbuffers::GetBufferIdentifier(buf,true);
const uint8_t prefixSize = flatbuffers::GetPrefixedSize(buf);
bool hasIdentifier = flatbuffers::BufferHasIdentifier(buf,HEADER);

boost::asio::write(s, boost::asio::buffer(buf,size));

收到消息时的服务器输出:

代码语言:javascript
运行
复制
Builder IdentifierABV
Builder Has Identifier1
ID5
NAME:ABCDEFGABCDEFGABCDEFGABCDEFGABCDEFG I AM HERE!

看看Builder IdentifierABV,它确实缩短了它的长度。必须是Builder IdentifierABVG <--

EN

回答 2

Stack Overflow用户

发布于 2020-09-25 02:37:26

根据@user4581301和@john的建议,我做了一些更改以使其正常工作。

我改变了:

代码语言:javascript
运行
复制
boost::asio::streambuf body_;

至:

代码语言:javascript
运行
复制
std::vector<size_t>* body_;

read_message()看起来像这样:

代码语言:javascript
运行
复制
void Vibranium::Client::read_message() {
    auto self(shared_from_this());
    (*_packet.body_).resize(_packet.body_size);
    boost::asio::async_read(socket,
    boost::asio::buffer(&_packet.body_, _packet.body_size),
    [this, self](boost::system::error_code ec,std::size_t bytes_transferred)
    {
        if ((boost::asio::error::eof == ec) || (boost::asio::error::connection_reset == ec))
        {
            Disconnect();
        }
        else
        {

            const char *HEADER = "ABVG";
            const char* buffIdentifier = flatbuffers::GetBufferIdentifier(&_packet.body_);
            bool hasIdentifier = flatbuffers::BufferHasIdentifier(&_packet.body_,HEADER);

            std::cout << "Builder Identifier" << buffIdentifier << std::endl;
            std::cout << "Builder Has Identifier" << hasIdentifier << std::endl;
            auto ac = GetAccountRole_Packet(&_packet.body_);
            std::cout << "ID" << ac->id() << std::endl;
            std::cout << "NAME:" << ac->name()->c_str() << std::endl;
            read_size();
        }
    });
}
票数 0
EN

Stack Overflow用户

发布于 2020-09-28 22:30:39

代码语言:javascript
运行
复制
boost::asio::streambuf body_;

Body不是POD或此类对象的连续数组。因此,asio::buffer(&body_, ...)是非法的(调用UB)。

只需按照给定的方式使用body_ (在复合操作中接受,如boost::asio::async_readhttps://www.boost.org/doc/libs/1_74_0/doc/html/boost_asio/reference/async_read.html)。

当然,您可以使用另一种缓冲区类型,但不需要像您自己回答的那样使用额外的动态分配级别:

代码语言:javascript
运行
复制
std::vector<size_t> body_;

// ...
body_resize(XXX);

// ...
     asio::buffer(body_),
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64051465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档