2

AT91SAM9263 ボードで組み込み開発を行っていますが、奇妙な問題に遭遇しました。Debian Linux カーネル 2.6.18.4 を実行しており、arm-linux-gcc 3.4.6 でクロスコンパイルされ、C ライブラリに uClibc-0.9.28 を使用しています。カーネル デバイス ドライバーをデバッグしていますが、特定の関数が System.map ファイルに表示されません。当然のことながら、ブレークポイントを設定することはできません。奇妙なことに、その呼び出し関数に割り込むと、ステップインできません。gdb の nexti コマンドを使用すると、関数は実行されますが、ソースはスキップされます。関数は atmel_rx_chars(struct uart_port *port) です。これは atmel_serial.c で宣言された static void 関数であり、その例は [1] に示されています。同じファイル (atmel_tx_chars(struct uart_port *port)、たとえば) これらは同じファイルで宣言され、実際には System.map ファイルでインデックス化されています。[2] によると、「System.map は 'nm vmlinux' によって生成され、無関係または興味のないシンボルは grep で抽出されます。」nm (および objdump) を使用してすべてのシンボルを表示しようとしましたが、それでも出力に表示されません。ただし、atmel_rx_chars vmlinux を grep すると、一致が返されます。私は自分自身を少しパワーユーザーだと思っていましたが、その後は本当に困惑しています. どんなアドバイスでも大歓迎です。私は自分自身を少しパワーユーザーだと思っていましたが、その後は本当に困惑しています. どんなアドバイスでも大歓迎です。私は自分自身を少しパワーユーザーだと思っていましたが、その後は本当に困惑しています. どんなアドバイスでも大歓迎です。

ありがとうございました、

ジェイス

[1] http://lxr.free-electrons.com/source/drivers/serial/atmel_serial.c#L379
[2]http://www.faqs.org/docs/Linux-HOWTO/Kernel-HOWTO.html#systemmap

4

2 に答える 2

2

表示されない理由は、コンパイラがその関数をインライン展開しているためです。静的であると宣言され、1 か所でのみ呼び出されるため、コンパイラはインライン化します。ブレークポイントを置きたい場合は、ソースを変更して、静的と宣言されないようにし、再コンパイルします。

于 2010-07-21T16:45:27.637 に答える
0

興味があるかもしれない人のために、なぜそれがatmel_rx_charsをSystem.mapのアドレスにマップしないのか理解できませんでした。この状況でデバッグするために、通常どおりブレークポイントを設定できます。私が答えを探していたとき、それはもっと明白だったはずだと思います。とにかくgdbコマンドラインタイプで

b source_file.c:line#

したがって、この例では、

b atmel_serial.c:381

そして、あなたが「行方不明」のルーチンを打つたびにそれは壊れます。ただし、これはまだ不完全な解決策です。特定の行への分割は機能しますが、呼び出し元の関数(atmel_handle_receive)のスタックフレームを残さないため、atmel_rx_charsのローカルはgdbにアクセスできません。いつものように、どんな助けや洞察もいただければ幸いです。他の誰かがこの問題またはそれに似た問題に遭遇した場合に、これが良い出発点として役立つことを願っています。

ありがとうございました、

ジェイス

于 2010-02-23T21:29:31.347 に答える