Re: mongoCXX: SIG: SEGFAULT while calling find_one()

From: Andrew Morrow <andrew.morrow@xxxxxxxxxxx>
To: "mongodb-user@xxxxxxxxxxxxxxxx" <mongodb-user@xxxxxxxxxxxxxxxx>
Date: Mon, 2 May 2016 18:13:13 -0400
Why ads?
On Mon, May 2, 2016 at 5:54 PM, javantamt <javantamt@xxxxxxxxx> wrote:

Hey there!





Calling in this assambly the funcion* find_one()* is throwing a segfault.
I don't know why.
It looks like an obvious misstake...


I think I know what the problem is, see below.




Member function:
int CMongo::FindOne(std::string strJSONFind, std::string strJSONOrderBy,
core::v1::optional<bsoncxx::v_noabi::document::value> &docReturn ){

  int iErr = 0;

  mongocxx::options::find MyFindOptions{};
  MyFindOptions.sort(bsoncxx::from_json(strJSONOrderBy).view());
  // core::v1::optional<bsoncxx::v_noabi::document::value> XXX;

  try{
  //docReturn =
collJobs.find_one(bsoncxx::from_json(strJSONFind).view(),MyFindOptions);
 // SEGFAULT
  // XXX =
collJobs.find_one(bsoncxx::from_json(strJSONFind).view(),MyFindOptions); //
segfault
   // auto i =
collJobs.find_one(bsoncxx::from_json(strJSONFind).view(),MyFindOptions); //
segfault
    auto i = collJobs.find_one(bsoncxx::from_json(strJSONFind).view(),
MyFindOptions);  // segfault



Note: this isn't your problem, but you shouldn't need the .view calls
above. The bsoncxx::from_json is an rvalue and should be able to be passed
directly to find_one.




Class header:
class CMongo {
public:
  CMongo();

  int FindOne(
      std::string strJSONFind,
      std::string strJSONOrderBy,
      core::v1::optional<bsoncxx::v_noabi::document::value> &docReturn );
  virtual ~CMongo();

private:
  mongocxx::client conn;    // connection to database
  class mongocxx::v_noabi::collection collJobs;
};



Class Constructor:
CMongo::CMongo() {
  // TODO Put this in every init functions withe a question of existence
  mongocxx::client conn(mongocxx::uri("Mongo credentiales" ));
  collJobs = conn["Database"]["collection"];
}


I think you haven't actually initialized the member CMongo::conn here - you
have shadowed it, and created a temporary mongocxx::client object called
'conn' on the stack. You then use that to initialize CMongo::collJobs, and
it immediately goes out of scope.

That is not a legal usage: the collection object must outlive the
connection object that produced it.

Can you see if your segfault is resolved if you write this as:

conn = mongocxx:client(mongocxx::uri("Mongo credentiales" ));

Even better would be to initialize conn in the member initializer list in
CMongo::CMongo.

I recommend running your application under valgrind or AddressSanitizer to
find these sorts of mistakes.

-- 
You received this message because you are subscribed to the Google Groups "mongodb-user"
group.

For other MongoDB technical support options, see: https://docs.mongodb.org/manual/support/
--- 
You received this message because you are subscribed to the Google Groups "mongodb-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mongodb-user+unsubscribe@xxxxxxxxxxxxxxxx.
To post to this group, send email to mongodb-user@xxxxxxxxxxxxxxxx.
Visit this group at https://groups.google.com/group/mongodb-user.
To view this discussion on the web visit https://groups.google.com/d/msgid/mongodb-user/CAHX05qEEtSZeJdi%2B-iR-R1V156FuGjb0dcFDGYR3C2xBoG7jfQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.
Why ads?