20

operator<<(std::ostream &os, const ClassX &x)gdb内からどのように呼び出しますか?

言い換えると、gdbでオブジェクトをどのように出力しますか?

call std::cout<<xまたはcall operator<<(std::cout, x)私のために働いていないようです!

何か案は?

4

4 に答える 4

11

私が見つけた唯一の方法はこれでした:

call 'operator<<(std::ostream&, myclass&)'(mycout, c)

std::cout何らかの理由でgdbに表示されなかったため、次のように独自に作成する必要がありました。

std::ostream mycout(std::cout.rdbuf());

あなたはこれをしたい理由を何も述べていませんprint yourvariableが、もっと簡単ではないでしょうか?

これが絶対に必要な場合はPrint、クラスにメソッドを作成し、そこからメソッドを呼び出してからoperator<<Printgdbからオブジェクトのメソッドを呼び出すことができます。

stdoutはおそらくgdbにバッファリングされているため、何らかの方法でリダイレクトしない限り、出力は表示されないことに注意してください。

この問題については、gdbのメーリングアーカイブからこのディスカッションを参照してください。

于 2010-09-30T17:35:40.927 に答える
6

次のような関数を定義することもできます。

define printType
call operator<<(std::ostream&, const $arg0 &)(std::cerr, $arg1)
end

そしてそれを次のように使用します:

printType ClassX objectOfClassX

于 2016-08-18T09:03:10.440 に答える
2

私にとってcall operator<<はエラーなしで実行されましたが、印刷されませんでした。に電話する必要があったことがわかりましたflush。これがあなたが入れることができる便利な関数です.gdbinit

define str
    call (void)operator<<(std::cout, $arg0)
    call (void)std::cout.flush()
    printf "\n"
end
于 2018-02-03T20:03:23.943 に答える
1

私の中には次のものがあります.gdbinitoperator<<がテンプレートである場合、またはタイプを正しくするために多くの入力が必要な場合、ここでの以前の回答は機能しませんでした。このアプローチでは、シンボルテーブルを検索して、正しいを見つけますoperator<<。これは、演算子が明示的にインスタンス化されている場合にのみ機能します。

python
import gdb
import re
class LexicalCast(gdb.Command):
    def __init__(self):
        super(LexicalCast, self).__init__("lexical_cast", gdb.COMMAND_DATA)

    def matches(self, symbol, type, exact=True):
        params = symbol.find('('), symbol.find(')')
        if -1 in params: return False
        params = symbol[params[0]+1 : params[1]]
        if re.match("^%s, %s( const)?&?$"%(re.escape("std::ostream&"), re.escape(type)), params): return True
        if not exact and re.match("^%s, .*::%s( const)?&?$"%(re.escape("std::ostream&"), re.escape(type)), params): return True
        return False

    def invoke(self, arg, from_tty):
        value = gdb.parse_and_eval(arg)
        type = str(value.type.strip_typedefs().unqualified())
        # isn't unqualified() supposed to do that already?
        if type.startswith("const "): type = type[6:]
        if type.startswith("struct "): type = type[7:]
        if type.endswith(" &"): type = type[:-2]
        # there's probably a better way to browse the list of symbols ...
        shift_operators = gdb.execute("info functions operator<<", False, True).split('\n')  
        matching_operators = [ op for op in shift_operators if self.matches(op, type)]
        if not matching_operators:
            gdb.write("No operator<<(std::ostream&, const %s&) found in the symbols. Trying to find a match with additional namespace qualifiers.\n"%(type,))
            matching_operators = [ op for op in shift_operators if self.matches(op, type, False)]

        if not matching_operators:
            gdb.write("No operator<<(std::ostream&, const .*::%s&) found in the symbols. Did you forget to explicitly instantiate your operator?\n"%(type,))     
        else:
            if len(matching_operators) > 1:
                gdb.write("Found multiple operator<< matching this expression; trying to call each one of them...\n")                          
            for op in matching_operators:
                try:                     
                    op = op.split('  ', 1)[1][:-4] if op.endswith("@plt") else op.split(':', 1)[1].split('&', 1)[1].strip()[:-1]
                    gdb.execute("call (void)'%s'((std::cout), (%s))"%(op, arg))      
                    gdb.execute("call (void)std::cout.put('\\n')")
                    gdb.execute("call (void)std::cout.flush()")
                    break
                except Exception as e:
                    gdb.write("Could not invoke %s: %s\n"%(op, e))

LexicalCast()
end   

GDBでは、次のように使用します。

(gdb) lex sector[0]
4: 1 ~ ([-3.00170 +/- 3.86e-6], [-1.73303 +/- 7.55e-8])
(gdb) lex 123
No operator<<(std::ostream&, const int&) found in the symbols. Did you explicitly instantiate that operator?

もちろん、これはほとんどの場合ハックであり、GDBの印刷方法を変更した場合は失敗する可能性がありますがinfo functions、私の目的にはうまく機能します。

于 2019-04-06T14:36:08.087 に答える