

MacOSにて、ゲームパッドを利用して **文字入力がしたい** と思い、プログラムを作成していました。  
使用している言語・環境はjavascript/node.js/Electron、ライブラリはrobot.jsです。

キーボードの入力のエミュレートは、制作初期は上手くいっていました。しかし、ある時からキーボード入力のメソッドを実行すると、文字が入力されずElectronが落ちるようになってしまいました。

エラーが表示されずに落ちるため、Electron抜きでテストしてみました。正しく動けば「a」が入力されるコードです。

[code]

    const robot=require('robotjs');
    robot.keyTap('a');
    
[/code]

結果、 **文字は入力されず** 、以下のような出力が出ました。

[code]

    zsh: segmentation fault  node
    
[/code]

このエラーについて調べたところ、segfault-handlerというライブラリで詳細ログが見れるということだったので、以下のように導入してみました。

[code]

    const SegfaultHandler = require('segfault-handler');
    SegfaultHandler.registerHandler('crash.log');
    const robot=require('robotjs');
    robot.keyTap('a');
    
[/code]

返ってきたログ出力は以下でした。  
この出力の詳細は自分には読み解けませんでした。

[code]

    PID 2643 received SIGSEGV for address: 0x0
    0   segfault-handler.node               0x0000000106ea534c _ZL16segfault_handleriP9__siginfoPv + 288
    1   libsystem_platform.dylib            0x00000001b853d4c4 _sigtramp + 56
    2   robotjs.node                        0x0000000106ed66d0 keyCodeForChar + 276
    3   robotjs.node                        0x0000000106ed2b6c _Z6keyTapRKN3Nan20FunctionCallbackInfoIN2v85ValueEEE + 300
    4   robotjs.node                        0x0000000106ed5818 _ZN3Nan3impL23FunctionCallbackWrapperERKN2v820FunctionCallbackInfoINS1_5ValueEEE + 208
    5   node                                0x00000001027c4adc _ZN2v88internal25FunctionCallbackArguments4CallENS0_15CallHandlerInfoE + 540
    6   node                                0x00000001027c4090 _ZN2v88internal12_GLOBAL__N_119HandleApiCallHelperILb0EEENS0_11MaybeHandleINS0_6ObjectEEEPNS0_7IsolateENS0_6HandleINS0_10HeapObjectEEESA_NS8_INS0_20FunctionTemplateInfoEEENS8_IS4_EENS0_16BuiltinArgumentsE + 504
    7   node                                0x00000001027c3894 _ZN2v88internalL26Builtin_Impl_HandleApiCallENS0_16BuiltinArgumentsEPNS0_7IsolateE + 228
    8   node                                0x0000000102f4bf8c Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_BuiltinExit + 108
    9   node                                0x0000000102ee6478 Builtins_InterpreterEntryTrampoline + 248
    10  node                                0x0000000102ee6478 Builtins_InterpreterEntryTrampoline + 248
    11  node                                0x0000000102ee6478 Builtins_InterpreterEntryTrampoline + 248
    12  node                                0x0000000102ee6478 Builtins_InterpreterEntryTrampoline + 248
    13  node                                0x0000000102ee6478 Builtins_InterpreterEntryTrampoline + 248
    14  node                                0x0000000102ee6478 Builtins_InterpreterEntryTrampoline + 248
    15  node                                0x0000000102ee6478 Builtins_InterpreterEntryTrampoline + 248
    16  node                                0x0000000102ee42ac Builtins_JSEntryTrampoline + 172
    17  node                                0x0000000102ee3f44 Builtins_JSEntry + 164
    18  node                                0x000000010288dcdc _ZN2v88internal12_GLOBAL__N_16InvokeEPNS0_7IsolateERKNS1_12InvokeParamsE + 2536
    19  node                                0x000000010288d2dc _ZN2v88internal9Execution4CallEPNS0_7IsolateENS0_6HandleINS0_6ObjectEEES6_iPS6_ + 200
    20  node                                0x000000010275d6fc _ZN2v88Function4CallENS_5LocalINS_7ContextEEENS1_INS_5ValueEEEiPS5_ + 448
    21  node                                0x00000001025c54c8 _ZN4node19ExecuteBootstrapperEPNS_11EnvironmentEPKcPNSt3__16vectorIN2v85LocalINS6_6StringEEENS4_9allocatorIS9_EEEEPNS5_INS7_INS6_5ValueEEENSA_ISF_EEEE + 100
    22  node                                0x00000001025c64a4 _ZN4nodeL14StartExecutionEPNS_11EnvironmentEPKc + 312
    23  node                                0x00000001025c6350 _ZN4node14StartExecutionEPNS_11EnvironmentENSt3__18functionIFN2v810MaybeLocalINS4_5ValueEEERKNS_26StartExecutionCallbackInfoEEEE + 1044
    24  node                                0x0000000102549970 _ZN4node15LoadEnvironmentEPNS_11EnvironmentENSt3__18functionIFN2v810MaybeLocalINS4_5ValueEEERKNS_26StartExecutionCallbackInfoEEEE + 136
    25  node                                0x000000010262cb78 _ZN4node16NodeMainInstance3RunEPiPNS_11EnvironmentE + 72
    26  node                                0x000000010262c888 _ZN4node16NodeMainInstance3RunEPKNS_16EnvSerializeInfoE + 120
    27  node                                0x00000001025c847c _ZN4node5StartEiPPc + 180
    28  dyld                                0x0000000107089088 start + 516
    
    
[/code]

* * *

robot.jsと同じく、キーボードやマウスを操作できるnut.jsでも同様の処理をテストしてみました。こちらも以前は動いていました。

[code]

    const {keyboard}=require('@nut-tree/nut-js');
    keyboard.type(45);
    
[/code]

結果は同じでした。

[code]

    zsh: segmentation fault  node
    
[/code]

同じくsegfault-handlerを導入した際のコードとログ出力です。

[code]

    const SegfaultHandler = require('segfault-handler');
    SegfaultHandler.registerHandler('crash.log');
    const {keyboard}=require('@nut-tree/nut-js');
    keyboard.type(45);
    
[/code]

↓

[code]

    PID 11392 received SIGSEGV for address: 0x0
    0   segfault-handler.node               0x000000010719134c _ZL16segfault_handleriP9__siginfoPv + 288
    1   libsystem_platform.dylib            0x00000001922894c4 _sigtramp + 56
    2   libnut.node                         0x00000001071f4054 keyCodeForChar + 276
    3   libnut.node                         0x00000001071efa0c _Z7_keyTapRKN4Napi12CallbackInfoE + 188
    4   libnut.node                         0x00000001071f3858 _ZN4Napi7details12WrapCallbackIZNS0_12CallbackDataIPFNS_6NumberERKNS_12CallbackInfoEES3_E7WrapperEP10napi_env__P20napi_callback_info__EUlvE_EEP12napi_value__T_ + 60
    5   libnut.node                         0x00000001071f3800 _ZN4Napi7details12CallbackDataIPFNS_6NumberERKNS_12CallbackInfoEES2_E7WrapperEP10napi_env__P20napi_callback_info__ + 28
    6   node                                0x00000001028a03b0 _ZN6v8impl12_GLOBAL__N_123FunctionCallbackWrapper6InvokeERKN2v820FunctionCallbackInfoINS2_5ValueEEE + 104
    7   node                                0x0000000102aa8adc _ZN2v88internal25FunctionCallbackArguments4CallENS0_15CallHandlerInfoE + 540
    8   node                                0x0000000102aa8090 _ZN2v88internal12_GLOBAL__N_119HandleApiCallHelperILb0EEENS0_11MaybeHandleINS0_6ObjectEEEPNS0_7IsolateENS0_6HandleINS0_10HeapObjectEEESA_NS8_INS0_20FunctionTemplateInfoEEENS8_IS4_EENS0_16BuiltinArgumentsE + 504
    9   node                                0x0000000102aa7894 _ZN2v88internalL26Builtin_Impl_HandleApiCallENS0_16BuiltinArgumentsEPNS0_7IsolateE + 228
    10  node                                0x000000010322ff8c Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_BuiltinExit + 108
    11  node                                0x00000001031ca478 Builtins_InterpreterEntryTrampoline + 248
    12  node                                0x00000001032742c0 Builtins_PromiseConstructor + 2208
    13  node                                0x00000001031c76f0 Builtins_JSBuiltinsConstructStub + 368
    14  node                                0x00000001032b87dc Builtins_ConstructHandler + 636
    15  node                                0x00000001031ca478 Builtins_InterpreterEntryTrampoline + 248
    16  node                                0x00000001031ca478 Builtins_InterpreterEntryTrampoline + 248
    17  node                                0x00000001032742c0 Builtins_PromiseConstructor + 2208
    18  node                                0x00000001031c76f0 Builtins_JSBuiltinsConstructStub + 368
    19  node                                0x00000001032b87dc Builtins_ConstructHandler + 636
    20  node                                0x00000001031ca478 Builtins_InterpreterEntryTrampoline + 248
    21  node                                0x00000001031ca478 Builtins_InterpreterEntryTrampoline + 248
    22  node                                0x00000001031ca478 Builtins_InterpreterEntryTrampoline + 248
    23  node                                0x00000001031ca478 Builtins_InterpreterEntryTrampoline + 248
    24  node                                0x00000001031ca478 Builtins_InterpreterEntryTrampoline + 248
    25  node                                0x00000001031ca478 Builtins_InterpreterEntryTrampoline + 248
    26  node                                0x00000001031ca478 Builtins_InterpreterEntryTrampoline + 248
    27  node                                0x00000001031ca478 Builtins_InterpreterEntryTrampoline + 248
    28  node                                0x00000001031c82ac Builtins_JSEntryTrampoline + 172
    29  node                                0x00000001031c7f44 Builtins_JSEntry + 164
    30  node                                0x0000000102b71cdc _ZN2v88internal12_GLOBAL__N_16InvokeEPNS0_7IsolateERKNS1_12InvokeParamsE + 2536
    31  node                                0x0000000102b712dc _ZN2v88internal9Execution4CallEPNS0_7IsolateENS0_6HandleINS0_6ObjectEEES6_iPS6_ + 200
    
[/code]

* * *

別々のライブラリで似たエラーが起こっているので、アクセス権か何かが絡んでいるのかと予想していますが、これ以上具体的に掘り下げる手立てが思いつきません。  
元々は動いていたコードだけに、ピンとくる原因がありません。何らかご教示いただければ幸いです。

MacOS Monterey 12.3  
node v16.4.1  
electron v13.1.5  
robot.js 0.6.0  
nut.js 2.0.1

### 追記

Mac内で普段開発に使っているユーザーアカウントとは別のアカウントを作成し、上のコードを実行したところ、動きました。  
これは普段のアカウント上で何らかのソフトウェアがキー入力を妨害していると見た方がよろしいのでしょうか？

### 追記2（2022.6.26）

上のコードについて、

[code]

    $ sudo node 
    
[/code]

コマンドで実行したところ、動きました。

『sudoでないとSegmentation Faultが起こる』というのは、コード的・環境的にどういう状況が考えられるのでしょうか？  
最終的にElectronで使用したので、そのあたりを明らかにしたいです。

# 追記3（2022.7.4）

akira ejiri様の回答を受けて、システムコールトレースについて調べ、実際にやってみようとしました。

[code]

    sudo dtruss -f sudo -u $(id -u -n) node ...
    
[/code]

帰ってきた出力は以下でした。

[code]

    dtrace: system integrity protection is on, some features will not be available
    
    dtrace: failed to execute sudo: Operation not permitted
    
[/code]

この文から、System Integrity Protection (SIP)
をオフにすれば動くのかと考え（ここからMacOSレベルの話になります）、以下のサイトを参考に、macOS復旧を起動してセキュリティ設定の変更を試みました。  
<https://www.too.com/support/faq/mac/maintenance/23554.html>  
<https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13252085413>  
<https://ascii.jp/elem/000/004/048/4048177/2/>

「ターミナル」で試した入力と出力

[code]

    -bash-3.2# csrutil disable
    csutil: The OS environment does not allow changing security configuration options.
    Ensure that the system was booted into Recovery OS via the standard user action.
    
[/code]

「起動セキュリティユーティリティ」を開いた時に出た警告

> **セキュリティ設定を変更できません。**  
>  セキュリティ設定を変更するには、Macの電源をオフにしてから、電源ボタンを押したままにしてmacOSの復旧を起動してください。

つまり、どちらも復旧メニューから実行しているにもかかわらず、『復旧からの起動でないと変更できない』と言われてしまうのです。


CC BY-SA 4.0
2022-06-05T02:09:53.933
89226
2022-07-04T09:31:46.500
2022-07-04T09:31:46.500
52932
52932
question
javascript macos node.js
Node.jsライブラリでキーボード入力ができない


> 『sudoでないとSegmentation Faultが起こる』というのは、コード的・環境的にどういう状況が考えられるのでしょうか？

root権限がないと失敗する処理(システムコール呼び出し等)があり、エラーチェックが疎かな場合、後続の処理で「Segmentation
Fault」が発生しても不思議ではありません。

システムコールをトレースしてみると原因が分かるかもしれません。

[code]

    sudo dtruss -f sudo -u $(id -u -n) node
    
[/code]

rootユーザで実行するとエラーが再現されないようですので、rootで実行したときの結果と比較してみるのもよいと思います。

[code]

    sudo dtruss -f node
    
[/code]


CC BY-SA 4.0
2022-06-26T10:24:19.673
89610
2022-06-26T10:24:19.673
35558
89226
answer