bugfix> c++ > 投稿

私は現在、C ++ NodeJSプラグインを記述しようとしていますnbind とともに普遍的な例。サンプルのビルドと実行は完全に機能します。今、2つの質問があります。1つは一般的なデバッグに関するもので、もう1つは私の問題に関するものです。

を追加しました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 を追加してみたフラグですが、ビルドも生成しますリリース フォルダ。

私の構築コマンドは、普遍的な例で提案されているように、次のとおりです。

"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);
}

だから2つの質問があります

  • 一般的でより重要:nbind c ++アドオンのより快適なデバッグオプションを取得するにはどうすればよいですか?
  • 私の問題により具体的で、RF24に関連している:各RF24関数呼び出しでそのエラーが表示されるのはなぜですか?
回答 1 件
  • 最初の質問に対して解決策を得ました。 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
    
    

    何が起こっているのか、さらに掘り下げる方法についてのアイデアを誰かが知っているなら、大歓迎です。 node-gypでビルドするのではなく、RF24スクリプトを使用して共有ライブラリを作成しました。生成されるエラーはまったく同じです。

    編集:最初にnodejsなしでテスト目的のための回避策を構築します。これは、プログラムのルート権限を与えるときに機能します。これは、どのネットワークにも接続されていないスタンドアロンのrasbpiであるため、rootは問題になりません。 SPIとGPIOのため、nodejsアドオンにはルート権限が必要です。

あなたの答え