Отладка узлов njbind c ++ - PullRequest
0 голосов
/ 25 мая 2018

В настоящее время я пытаюсь написать плагин C ++ NodeJS, используя nbind с универсальным примером .Сборка и запуск примера работает отлично.Теперь у меня есть два вопроса: первый касается общей отладки, второй - моей проблемы.

Я добавил RF24 lib.Построение объекта RF24 также работает, но, например, вызов функции getChannel() или printDetails() в Nodejs возвращает просто

terminated called after throwing an instance of 'int'
npm ERR! Test failed. See above for more details

Как я могу получить более подробную информацию об ошибках, например, номер файла и номер строки?Я попытался добавить флаги node-gyp configure --debug build --debug, но при сборке также создается только папка Release .

Моя команда построения следующая, как предложено в универсальном примере.

"build:native": "autogypi -r build && node-gyp -C build/native configure --debug build --debug && copyasm build/native dist"

Я использую RPi Zero W (Arm v6).Мой текущий binding.gyp , расположенный в . / Build / native , выглядит следующим образом

{
  "targets": [
    {
      "includes": [ "../auto.gypi" ],
      "sources": [
        "../../src/example.cpp",
        "../../libs/RF24-master/RF24.cpp",
        "../../libs/RF24-master/utility/RPi/bcm2835.cpp",
        "../../libs/RF24-master/utility/RPi/interrupt.cpp",
        "../../libs/RF24-master/utility/RPi/spi.cpp"
      ],
      "include_dirs": [
        "../../src",
        "../../libs/RF24-master"
      ],
      "cflags": [
        "-std=c++11",
        "-fpermissive"
      ],
      "cflags_cc!": [ "-fno-rtti" ] 
    }
  ],
  "includes": [
    "../auto-top.gypi"
  ]
}

Упрощенная программа example.cpp выглядит как

#include "RF24.h"
#include "example.h"

Example::Example(uint16_t cePin, uint16_t spiBus): cePin(cePin), spiBus(spiBus) {
  this->radio = new RF24(cePin, spiBus);
}

uint8_t Example::getChannel() {
  return this->radio->getChannel();
}

И соответствующий заголовок example.h выглядит следующим образом:

#ifndef EXAMPLE_H
#define EXAMPLE_H

class Example{
  uint8_t cePin = 22, spiBus = 0;
  RF24* radio;

  public:
    Example(uint16_t cePin, uint16_t spiBus);
    uint8_t getChannel();
};

#endif

#include "nbind/nbind.h"

NBIND_CLASS(Example) {
  construct<uint8_t, uint8_t>();
  method(getChannel);
}

Итак, есть два вопроса

  • Общие и более важные: Как получить более удобные опции отладки для nbindc ++ addons?
  • Более конкретно для моей проблемы, связанной с RF24: почему эта ошибка появляется при каждом вызове функции RF24?

1 Ответ

0 голосов
/ 25 мая 2018

По первому вопросу я получил решение.NodeJS хорошо работает с gdb .Таким образом,

sudo gdb node
  > run myscript.js

печатает следующую чуть более подробную ошибку

Thread 1 "node" received signal SIGSEGV, Segmentation fault.
0xb4c15ff8 in bcm2835_peri_read () from /usr/local/lib/librf24.so.1

Если кто-то вокруг знает, что происходит или идеи о том, как копать дальше, милости просим.Я использовал скрипт RF24 для создания разделяемой библиотеки вместо того, чтобы создавать ее с помощью node-gyp.Ошибка, которую он выдает, точно такая же.

РЕДАКТИРОВАТЬ: я строю обходной путь для целей тестирования без nodejs в первую очередь.Работает при предоставлении рут прав доступа к программе.Поскольку это автономный rasbpi, не подключенный к какой-либо сети, root не будет проблемой.Аддон nodejs требует корневых разрешений из-за SPI и GPIO.

...