我设计了一个类来处理多个UNIX套接字操作,例如发送和接收单个值或数组。关键在于统一服务器和客户端方法,以便在两种情况下使用相同的代码。
我的unix_socket.hpp
:
#ifndef __SOCKET_HPP
#define __SOCKET_HPP
#ifndef EIGEN_NO_DEBUG
#define EIGEN_NO_DEBUG
#endif
#include <Eigen/Dense>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <string>
#define DEFAULT_SOCKET_PATH (std::string(getenv("HOME"))+std::string("/msock")).data()
#define SERVER_MODE 0
#define CLIENT_MODE 1
using Eigen::VectorXd;
using std::string;
struct message{
char type;
double value;
};
class unix_socket{
public:
double v_sent,v_recvd;
char c_sent, c_recvd;
VectorXd vector_recvd;
VectorXd vector_sent;
int sock, client_sock;
unsigned int t,len;
int mode; //0 server, 1 client
struct sockaddr_un local,remote;
string path;
unix_socket();
unix_socket(int sc_mode);
~unix_socket();
void initSocket(const char* sock_path);
void initSocket(const char* sock_path, const int sc_mode);
void wait();
void closeSocket();
int sendMsg(const char type, const double value);
int receiveMsg();
int sendVectorXd(const VectorXd& values);
int receiveVectorXd();
};
#endif
和unix_socket.cpp
:
#include "unix_socket.hpp"
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
using namespace std;
using Eigen::VectorXd;
unix_socket::unix_socket(){
v_sent=0;
v_recvd=0;
mode=0;
}
unix_socket::unix_socket(int sc_mode){
v_sent=0;
v_recvd=0;
mode=sc_mode;
}
unix_socket::~unix_socket(){
close(sock);
close(client_sock);
//system((std::string("rm ")+path).data());
}
void unix_socket::initSocket(const char* sock_path, const int sc_mode){
if (sc_mode==0){
// socket server
if (mode != sc_mode) mode=sc_mode;
if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
local.sun_family = AF_UNIX;
strcpy(local.sun_path, sock_path);
unlink(local.sun_path);
len = strlen(local.sun_path) + sizeof(local.sun_family);
if (bind(sock, (struct sockaddr *)&local, len) == -1) {
close(sock);
perror("bind"); exit(1);
}
} else if(sc_mode==1) {
// socket client
if (mode != sc_mode) mode=sc_mode;
if ((client_sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
remote.sun_family = AF_UNIX;
strcpy(remote.sun_path, sock_path);
len = strlen(remote.sun_path) + sizeof(remote.sun_family);
if (connect(client_sock, (struct sockaddr *)&remote, len) == -1) {
perror("connect");
exit(1);
}
printf("Connected.\n");
// ---
} else printf("Invalid sc_mode argument: %d\n",sc_mode);
path=string(sock_path);
}
void unix_socket::initSocket(const char* sock_path){
initSocket(sock_path,mode);
}
void unix_socket::wait(){
if (mode==0){
if (listen(sock, 5) == -1) {
perror("listen");
exit(1);
}
t = sizeof(remote);
if ((client_sock = accept(sock, (struct sockaddr *)&remote, &t)) == -1) {
perror("accept");
exit(1);
}
printf("Connected!\n");
} else printf("Invalid call to wait(): mode %d\n, must be 0",mode);
}
void unix_socket::closeSocket(){
//close(sock);
close(client_sock);
}
int unix_socket::sendMsg(const char type, const double value){
struct message msg;
msg.type=type;
msg.value=value;
int n = send(client_sock, &msg, sizeof(msg), 0);
if (n < 0) {
perror("send");
return -1;
}
c_sent=msg.type;
v_sent=msg.value;
return 0;
}
int unix_socket::receiveMsg(){
struct message msg;
int n = recv(client_sock, &msg, sizeof(msg), 0);
if (n < 0) {
perror("recv");
return -1;
}
c_recvd=msg.type;
v_recvd=msg.value;
return 0;
}
int unix_socket::sendVectorXd(const VectorXd& values){
sendMsg('A',values.rows());
for (int i = 0; i < values.rows(); ++i){
if (i<(values.rows()-1)) sendMsg('V',values(i));
else sendMsg('L',values(i));
}
return 0;
}
int unix_socket::receiveVectorXd(){
receiveMsg();
if (c_recvd=='A' && v_recvd>1){
vector_recvd=VectorXd::Zero(v_recvd);
for (int i = 0; i < vector_recvd.rows(); ++i){
receiveMsg();
vector_recvd(i)=v_recvd;
}
}
return 0;
};
总的来说,当使用简单的.cpp
进行测试时,一切似乎都运行良好,可以在两个方向上发送大量(~1000)VectorXd。但是,当在更复杂的程序中使用时,如下所示,我每次通过调用服务器端的malloc(): memory corruption:
来关闭套接字时都会出现unix_socket::closeSocket()
错误( context:程序正在运行机器人控制器的Webots实例发送和接收数据,该机器人控制器充当套接字客户端):
#include <iostream>
#include <fstream>
#include <string>
#include "../socket/unix_socket.hpp"
#include "asm.hpp"
#include <sstream>
#include <Eigen/Dense>
#include <cstdlib>
using namespace Eigen;
using namespace std;
int start_webots(const char* world){
//starting webots as a child process with known PID
int pid = fork();
if (pid == 0){
printf("Starting webots...");
execlp("/usr/local/bin/webots","webots",world,NULL);
printf("WEBOTS AUTOCLOSED!");
exit(1);
}
else printf("Webots PID: %i\n", pid);
return pid;
}
VectorXd asmParams(bool fall_break, int periods, double delay){
VectorXd p(5);
if (fall_break==true) p << 1,-1,1,periods,delay;
else p << 1,-1,0,periods,delay;
return p;
}
int main () {
int periods=10;
double delay=25.0;
string world_path="../../worlds/darwin_cpgs_noise.wbt";
start_webots(world_path.data());
unix_socket server;
server.initSocket(DEFAULT_SOCKET_PATH,0);
server.wait();
server.receiveVectorXd();
server.sendVectorXd(asmParams(true,periods,delay));
server.sendVectorXd(VectorXd::Ones(dim)*10);
asmemory aSm;
aSm.setMode(0);
bool end=false;
aSm.resetTimer();
while (aSm.isAcquiring()){
aSm.resetTimer();
while(aSm.isRunningRollout()){
server.receiveMsg();
if (server.c_recvd=='T' && aSm.lastTimeStep()) {
aSm.resize(NO_CHANGE,aSm.nTimeSteps()+1,NO_CHANGE);
}
else if (server.c_recvd=='E' && !aSm.lastTimeStep()) {
aSm.resize(NO_CHANGE,aSm.index_t()+1,NO_CHANGE);
end=true;
}
else if (server.c_recvd=='E' && aSm.lastTimeStep()) {
end=true;
}
aSm.setCurrentTime(server.v_recvd);
server.receiveVectorXd();
if (server.vector_recvd.rows()!=aSm.nSensors()) aSm.resize(server.vector_recvd.rows(),NO_CHANGE,NO_CHANGE);
aSm.sendToBuffer(server.vector_recvd);
if (end) break;
aSm.incrementTime();
end=false;
}
aSm.incrementSample();
server.sendMsg('R',-1.0);
// crashing the program:
server.closeSocket();
end=false;
}
aSm.learnData();
server.closeSocket();
return 0;
}
什么可能导致内存损坏?我假设unix_socket
类中有些错误,但数据是正确发送/接收的,但每次调用closeSocket()
时,即使在循环中间发送内存损坏错误。
==3874== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==3874== at 0x573DDA2: send (send.c:28)
==3874== by 0x406E12: unix_socket::sendMsg(char, double) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x402DB9: main (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== Address 0x7fefffe91 is on thread 1's stack
==3874==
==3874==
==3874== HEAP SUMMARY:
==3874== in use at exit: 2,451,739 bytes in 107 blocks
==3874== total heap usage: 316 allocs, 209 frees, 2,454,518 bytes allocated
==3874==
==3874== Searching for pointers to 107 not-freed blocks
==3874== Checked 2,640,168 bytes
==3874==
==3874== 59 bytes in 1 blocks are possibly lost in loss record 1 of 4
==3874== at 0x4C2C221: operator new(unsigned long) (vg_replace_malloc.c:298)
==3874== by 0x4EF03B8: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17)
==3874== by 0x4EF1D94: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17)
==3874== by 0x4EF1E72: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17)
==3874== by 0x4026FE: main (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874==
==3874== LEAK SUMMARY:
==3874== definitely lost: 0 bytes in 0 blocks
==3874== indirectly lost: 0 bytes in 0 blocks
==3874== possibly lost: 59 bytes in 1 blocks
==3874== still reachable: 2,451,680 bytes in 106 blocks
==3874== suppressed: 0 bytes in 0 blocks
==3874== Reachable blocks (those to which a pointer was found) are not shown.
==3874== To see them, rerun with: --leak-check=full --show-reachable=yes
==3874==
==3874== Use --track-origins=yes to see where uninitialised values come from
==3874== ERROR SUMMARY: 1620 errors from 10 contexts (suppressed: 0 from 0)
==3874==
==3874== 1 errors in context 1 of 10:
==3874== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==3874== at 0x573DDA2: send (send.c:28)
==3874== by 0x406E12: unix_socket::sendMsg(char, double) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x402DB9: main (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== Address 0x7fefffe91 is on thread 1's stack
==3874==
==3874==
==3874== 1 errors in context 2 of 10:
==3874== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==3874== at 0x573DDA2: send (send.c:28)
==3874== by 0x406E12: unix_socket::sendMsg(char, double) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x407100: unix_socket::sendVectorXd(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x402965: main (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== Address 0x7fefffe41 is on thread 1's stack
==3874==
==3874==
==3874== 1 errors in context 3 of 10:
==3874== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==3874== at 0x573DDA2: send (send.c:28)
==3874== by 0x406E12: unix_socket::sendMsg(char, double) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x40706E: unix_socket::sendVectorXd(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x402965: main (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== Address 0x7fefffe41 is on thread 1's stack
==3874==
==3874==
==3874== 1 errors in context 4 of 10:
==3874== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==3874== at 0x573DDA2: send (send.c:28)
==3874== by 0x406E12: unix_socket::sendMsg(char, double) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x407100: unix_socket::sendVectorXd(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x4028D8: main (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== Address 0x7fefffe41 is on thread 1's stack
==3874==
==3874==
==3874== 1 errors in context 5 of 10:
==3874== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==3874== at 0x573DDA2: send (send.c:28)
==3874== by 0x406E12: unix_socket::sendMsg(char, double) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x40706E: unix_socket::sendVectorXd(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x4028D8: main (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== Address 0x7fefffe41 is on thread 1's stack
==3874==
==3874==
==3874== 4 errors in context 6 of 10:
==3874== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==3874== at 0x573DDA2: send (send.c:28)
==3874== by 0x406E12: unix_socket::sendMsg(char, double) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x4070CC: unix_socket::sendVectorXd(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x4028D8: main (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== Address 0x7fefffe41 is on thread 1's stack
==3874==
==3874==
==3874== 19 errors in context 7 of 10:
==3874== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==3874== at 0x573DDA2: send (send.c:28)
==3874== by 0x406E12: unix_socket::sendMsg(char, double) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x4070CC: unix_socket::sendVectorXd(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x402965: main (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== Address 0x7fefffe41 is on thread 1's stack
==3874==
==3874==
==3874== 120 errors in context 8 of 10:
==3874== Invalid write of size 8
==3874== at 0x408B56: asmemory::sendToBuffer(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x402D48: main (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== Address 0x5a1e360 is 0 bytes after a block of size 24,000 alloc'd
==3874== at 0x4C2C73C: malloc (vg_replace_malloc.c:270)
==3874== by 0x40313F: Eigen::internal::aligned_malloc(unsigned long) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x4054DA: void* Eigen::internal::conditional_aligned_malloc<true>(unsigned long) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x40503C: double* Eigen::internal::conditional_aligned_new_auto<double, true>(unsigned long) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x404937: Eigen::DenseStorage<double, -1, -1, -1, 0>::resize(long, long, long) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x40C552: Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::resize(long, long) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x40CA07: void Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::resizeLike<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > >(Eigen::EigenBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x40C3F0: void Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::_resize_to_match<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > >(Eigen::EigenBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x40BDD0: Eigen::Matrix<double, -1, -1, 0, -1, -1>& Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::lazyAssign<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > >(Eigen::DenseBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x40B54B: Eigen::internal::assign_selector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >, false, false>::run(Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x40AD46: Eigen::Matrix<double, -1, -1, 0, -1, -1>& Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::_set_noalias<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > >(Eigen::DenseBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x40A0C4: void Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::_set_selector<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > >(Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::internal::false_type const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874==
==3874==
==3874== 1471 errors in context 9 of 10:
==3874== Invalid write of size 8
==3874== at 0x408FD7: asmemory::setCurrentTime(double) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x402B53: main (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== Address 0x5c641f0 is 0 bytes after a block of size 800 alloc'd
==3874== at 0x4C2C73C: malloc (vg_replace_malloc.c:270)
==3874== by 0x40313F: Eigen::internal::aligned_malloc(unsigned long) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x4054DA: void* Eigen::internal::conditional_aligned_malloc<true>(unsigned long) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x40503C: double* Eigen::internal::conditional_aligned_new_auto<double, true>(unsigned long) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x405F05: Eigen::DenseStorage<double, -1, -1, 1, 0>::resize(long, long, long) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x405CFC: Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >::resize(long, long) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x407605: void Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >::resizeLike<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1> > >(Eigen::EigenBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1> > > const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x4074E0: void Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >::_resize_to_match<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1> > >(Eigen::EigenBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1> > > const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x40749C: Eigen::Matrix<double, -1, 1, 0, -1, 1>& Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >::lazyAssign<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1> > >(Eigen::DenseBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1> > > const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x407477: Eigen::internal::assign_selector<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >, false, false>::run(Eigen::Matrix<double, -1, 1, 0, -1, 1>&, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x407442: Eigen::Matrix<double, -1, 1, 0, -1, 1>& Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >::_set_noalias<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1> > >(Eigen::DenseBase<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1> > > const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874== by 0x407408: void Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >::_set_selector<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1> > >(Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::internal::false_type const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/server)
==3874==
==3874== ERROR SUMMARY: 1620 errors from 10 contexts (suppressed: 0 from 0)
答案 0 :(得分:0)
对于内存错误
valgrind --track-originins = yes -v [您的计划]
给出未初始化的内存访问的痕迹,这可能导致程序的未定义行为。
泄漏,
valgrind --leak-check = full --show-reachable = yes -v [your program]
输出采用一组迹线的形式,每个迹线从下到上进行分析,
代表
== 3874 = = 1个块中的59个字节可能在4个丢失记录中丢失
== 3874 == at 0x4C2C221:operator new(unsigned long)(vg_replace_malloc.c:298)
== 3874 == by 0x4EF03B8:std :: string :: _ Rep :: _ S_create(unsigned long,unsigned long,std :: allocator const&amp;)(在/ usr / lib / x86_64-linux-gnu / libstdc ++中。 so.6.0.17)
== 3874 == by 0x4EF1D94:char * std :: string :: _ S_construct(char const *,char const *,std :: allocator const&amp;,std :: forward_iterator_tag)(在/ usr / lib / x86_64-中Linux的GNU /的libstdc ++。so.6.0.17)
== 3874 == by 0x4EF1E72:std :: basic_string,std :: allocator&gt; :: basic_string(char const *,std :: allocator const&amp;)(在/ usr / lib / x86_64-linux-gnu /中的libstdc ++。so.6.0.17)
== 3874 == by 0x4026FE:main(在/ home / joao / CloudPT / Bolsa / Webots / controllers / darwin-pi2 / server)
通话追踪从主开始,然后调用 basic_string 然后调用上方的函数调用,依此类推,最后到达 new 调用,但调用 new 的函数是 __ S_create 函数,意味着在调用此函数后没有空闲执行,或者在调用此函数时没有调用deinit方法该计划终止。
HTH