Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Special Interest Groups
  3. C++ Gurus
  4. std::string error
Forum Updated to NodeBB v4.3 + New Features

std::string error

Scheduled Pinned Locked Moved Solved C++ Gurus
27 Posts 4 Posters 5.8k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • K kshegunov
    23 Dec 2018, 08:29

    PS.
    A quick look here (see error code 28) leads me to believe you have dereferencing of an invalid pointer (or a call to a function through an invalid address) due to EXCVADDR holding nonsense; so I'm back to my original assumption. It's going to be hard without debug info to trace this down, but could you try to build this application in debug mode so at least you can get a more human(e) backtrace?

    M Offline
    M Offline
    mzimmers
    wrote on 23 Dec 2018, 16:50 last edited by
    #21

    @kshegunov The app is already built in debug. The reason the trace is so human-unfriendly is that I can't run monitor (a big part of my testing is connecting/disconnecting line power to the device, which entails removal of the USB cable that the monitor would run on), so I'm just logging what I can to the 2nd UART on the device. But, I've used xtensa-esp32-elf-addr2line to determine the line of source code, and it's definitely at the creation/assignment of the string in the message object.

    K 1 Reply Last reply 23 Dec 2018, 18:22
    0
    • M mzimmers
      23 Dec 2018, 16:50

      @kshegunov The app is already built in debug. The reason the trace is so human-unfriendly is that I can't run monitor (a big part of my testing is connecting/disconnecting line power to the device, which entails removal of the USB cable that the monitor would run on), so I'm just logging what I can to the 2nd UART on the device. But, I've used xtensa-esp32-elf-addr2line to determine the line of source code, and it's definitely at the creation/assignment of the string in the message object.

      K Offline
      K Offline
      kshegunov
      Moderators
      wrote on 23 Dec 2018, 18:22 last edited by kshegunov
      #22

      Do you at least have logging?
      I'd love to see the output of something along those lines (or equivalent):

      std::cerr << uintptr_t(m_params);
      std::cerr << uintptr_t(m_params->nvs);
      char * p  = m_params->nvs->getIpAddr(IP_ADDRESS)
      std::cerr << uintptr_t(p);
      

      Read and abide by the Qt Code of Conduct

      1 Reply Last reply
      0
      • M Offline
        M Offline
        mzimmers
        wrote on 24 Dec 2018, 14:58 last edited by
        #23

        Yes, I can get those. I'll do it first thing Wednesday when I return to the office.

        1 Reply Last reply
        1
        • M Offline
          M Offline
          mzimmers
          wrote on 26 Dec 2018, 21:12 last edited by
          #24

          Well...this is kind of embarrassing (and a little odd, too). I put in the telltales that kshegunov suggested, and...m_params had a value of 0. That's the embarrassing part, that I didn't check that myself.

          Here's the odd part: the reason the value was 0 was because when I created the Message object, I passed the incorrect object type to the c'tor. A Message object is supposed to be created like this:

          Message::Message(Tasks *params)
          {
              m_params = params;
          }
          

          But I was creating it like this:

          MsgType Worker::processMsg(Message &msg)
          {
              MsgType mt = msg.getType();
              switch (mt)
              {
              ...
              case MSG_SILENCE_BUZZER:
                  msgOut = new Message(msg);
                  msgOut->buildSilenceAck();
                  break;
          ...
          

          Sheer sloppiness on my part, but...why didn't the compiler yell at me?

          Anyway, thanks to everyone who looked at this.

          K 1 Reply Last reply 26 Dec 2018, 21:44
          0
          • M mzimmers
            26 Dec 2018, 21:12

            Well...this is kind of embarrassing (and a little odd, too). I put in the telltales that kshegunov suggested, and...m_params had a value of 0. That's the embarrassing part, that I didn't check that myself.

            Here's the odd part: the reason the value was 0 was because when I created the Message object, I passed the incorrect object type to the c'tor. A Message object is supposed to be created like this:

            Message::Message(Tasks *params)
            {
                m_params = params;
            }
            

            But I was creating it like this:

            MsgType Worker::processMsg(Message &msg)
            {
                MsgType mt = msg.getType();
                switch (mt)
                {
                ...
                case MSG_SILENCE_BUZZER:
                    msgOut = new Message(msg);
                    msgOut->buildSilenceAck();
                    break;
            ...
            

            Sheer sloppiness on my part, but...why didn't the compiler yell at me?

            Anyway, thanks to everyone who looked at this.

            K Offline
            K Offline
            kshegunov
            Moderators
            wrote on 26 Dec 2018, 21:44 last edited by kshegunov
            #25

            @mzimmers said in std::string error:

            Sheer sloppiness on my part, but...why didn't the compiler yell at me?

            C++ (and naturally C) is notorious for its implicit conversions and many compilers happily give you just enough rope to hang yourself; A reference is almost the same as a pointer to some object, same for an integer and by extension an enum. My advice is to (almost) always declare the constructor explicit so you don't get into that kind of trouble.
            E.g.:

            class Message
            {
            public
                explicit Message(Tasks *);
            };
            

            Read and abide by the Qt Code of Conduct

            M 1 Reply Last reply 26 Dec 2018, 21:47
            1
            • K kshegunov
              26 Dec 2018, 21:44

              @mzimmers said in std::string error:

              Sheer sloppiness on my part, but...why didn't the compiler yell at me?

              C++ (and naturally C) is notorious for its implicit conversions and many compilers happily give you just enough rope to hang yourself; A reference is almost the same as a pointer to some object, same for an integer and by extension an enum. My advice is to (almost) always declare the constructor explicit so you don't get into that kind of trouble.
              E.g.:

              class Message
              {
              public
                  explicit Message(Tasks *);
              };
              
              M Offline
              M Offline
              mzimmers
              wrote on 26 Dec 2018, 21:47 last edited by
              #26

              @kshegunov that's good advice, but this was more than just a reference/pointer mismatch: they were referring to/pointing to 2 different object types. I'd expect C++ to have been stricter about that...

              K 1 Reply Last reply 26 Dec 2018, 21:50
              0
              • M mzimmers
                26 Dec 2018, 21:47

                @kshegunov that's good advice, but this was more than just a reference/pointer mismatch: they were referring to/pointing to 2 different object types. I'd expect C++ to have been stricter about that...

                K Offline
                K Offline
                kshegunov
                Moderators
                wrote on 26 Dec 2018, 21:50 last edited by
                #27

                they were referring to/pointing to 2 different object types. I'd expect C++ to have been stricter about that...

                It'd depend on the compiler really, but from the machine's point of view it's all the same. Everything is/is converted to an address to some region in memory. Type-safety is something people invented to have at least some idea about what we are working with, and I agree, the compiler should've warned you at least. But, well, as I said almost everything decays to void * and from there the step into the abyss is just tiny ... ;)

                Read and abide by the Qt Code of Conduct

                1 Reply Last reply
                1

                21/27

                23 Dec 2018, 16:50

                • Login

                • Login or register to search.
                21 out of 27
                • First post
                  21/27
                  Last post
                0
                • Categories
                • Recent
                • Tags
                • Popular
                • Users
                • Groups
                • Search
                • Get Qt Extensions
                • Unsolved