我正在嘗試在 perl 中撰寫一些腳本來控制 GDB 除錯程序。在以下代碼中,我能夠運行 GDB 并傳遞一些 MI2 命令,但我無法捕獲 GDB 的輸出:
open(G, "| gdb -n -q --interpreter=mi2") || die("error opening gdb");
syswrite(G, "-file-exec-and-symbols ./a.out\n");
$x = sysread(G, $resp, 4096);
printf("x: %u\n", $x);
printf("resp: '%s'\n", $resp)
結果是:
x: 0
resp: ''
=thread-group-added,id="i1"
(gdb)
^done
(gdb)
這里的問題是 GDB 將輸出 '=thread-group-added,id="i1"' 直接列印到 tty,因此我無法在我的 perl 腳本中捕獲它以進行進一步解釋。我想將 GDB 的輸出捕獲到某個變數并對其進行解釋。從輸出中可以看出 sysread() 程序沒有讀取任何內容(“x: 0”)。我怎樣才能做到這一點?
編輯:經過一段時間的思考,我實作了一些解決方案來捕獲 GDB 的輸出。它需要命名管道(下面是“/tmp/pipe”):
open (G, "| gdb -n -q --interpreter=mi2 >& /tmp/pipe") || die("error opening gdb");
現在我可以從 perl 腳本中讀取 GDB 的輸出并對其進行決議。
uj5u.com熱心網友回復:
這只會打開該gdb程序以饋送(替換)它STDIN,而不是讀取它的輸出。G是管道的寫端。不能同時擁有 with open,請參見 pipe-open in open。
相反,請使用同時提供兩者的庫,例如IPC::Run
use warnings;
use strict;
use feature 'say';
use IPC::Run qw(run);
run [ qw(gdb -n -q --interpreter=mi2) ], \my $stdin, \my $so, \my $se;
say "out: $so" if $so;
say "err: $se" if $se;
這將列印行out: =thread-group-added,id="i1"和(gdb).
分配給$stdin寫入程式的,并從和/或最后STDIN讀取其標準輸出/錯誤(有一些方法可以讓它在發出時得到)。該模塊可以做更多的事情,請參閱檔案。$so$se
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464658.html
