0

Centos から Cygwin に移植していますが、アプリケーションがエラー メッセージなしで終了し、Botan::InitializationVector のコンストラクターの実行中に終了ステータス 0 になっていることがわかりました。

スピン変数を待機している main() で積極的に gdb をアタッチしようとすると、通常のスタック トレースが得られません。

(gdb) where
#0  0x7c90120f in ntdll!DbgUiConnectToDbg ()
   from /cygdrive/c/WINDOWS/system32/ntdll.dll
#1  0x7c952119 in ntdll!KiIntSystemCall ()
   from /cygdrive/c/WINDOWS/system32/ntdll.dll
#2  0x00000005 in ?? ()
#3  0x00000000 in ?? ()

そのため、gdb がないため、何が問題なのかを把握するのは困難です。

Cygwin でエラー メッセージが表示されないのに、アプリケーションが実行中に終了するのはなぜですか?

コンストラクターの後ではなく前の行のみを表示する詰まりのため、コンストラクター内にあると推測します。

clog << "  About to create iv for Botan.\n";
Botan::InitializationVector iv(_rng, size);
clog << "  About to copy iv for Botan.\n";

Botanはオープン ソースです: http://botan.randombit.net/ src/sym_algo/symkey.{h,cpp} からのコード スニペットを次に示します。

typedef OctetString InitializationVector;

class BOTAN_DLL OctetString
{
public:
  u32bit length() const { return bits.size(); }
  SecureVector<byte> bits_of() const { return bits; }

  const byte* begin() const { return bits.begin(); }
  const byte* end() const   { return bits.end(); }

  std::string as_string() const;

  OctetString& operator^=(const OctetString&);

  void set_odd_parity();

  void change(const std::string&);
  void change(const byte[], u32bit);
  void change(const MemoryRegion<byte>& in) { bits = in; }

  OctetString(class RandomNumberGenerator&, u32bit len);
  OctetString(const std::string& str = "") { change(str); }
  OctetString(const byte in[], u32bit len) { change(in, len); }
  OctetString(const MemoryRegion<byte>& in) { change(in); }
private:
  SecureVector<byte> bits;
};

OctetString::OctetString(RandomNumberGenerator& rng,
                     u32bit length)
{
   bits.create(length);
   rng.randomize(bits, length);
}

失敗したコードを main() に移動したところ、正常に動作しました。また、コードの周りに try catch ... を配置しましたが、例外はスローされません。main() とアプリケーションの後半の障害点の間で何か問題が発生します。分割統治を行って、機能しなくなった正確なポイントを絞り込むことができます。Botan 開発者の 1 人が、これも失敗する代わりに使用するために、この簡素化されたコードを提供してくれました。

Botan::AutoSeeded_RNG _rng;
unsigned int size = 1; // or 16, or 1452 all fail.
Botan::SecureVector<Botan::byte> iv_val(size);
cerr << "We get to here." << endl;
_rng.randomize(&iv_val[0], size);
cerr << "But not here." << endl;

デバッガーが動作するようになったので、segv が表示されます。

(gdb) s
Botan::AutoSeeded_RNG::randomize (this=0x1270380, out=0x5841420 "", len=1)
    at ../../src/Botan-1.8.11/build/include/botan/auto_rng.h:23
(gdb) s

Program received signal SIGSEGV, Segmentation fault.
0x005d79ee in Botan::AutoSeeded_RNG::randomize (this=0x1270380, 
    out=0x5841420 "", len=1)
    at ../../src/Botan-1.8.11/build/include/botan/auto_rng.h:23
(gdb) p rng
$7 = (class Botan::RandomNumberGenerator *) 0x5841324
(gdb) p *this
$8 = {<Botan::RandomNumberGenerator> = {
    _vptr$RandomNumberGenerator = 0x11efc14}, rng = 0x5841324}
(gdb) p *rng
$9 = {_vptr$RandomNumberGenerator = 0x656e6f4e}

auto_rng.h コードは次のとおりです。

class BOTAN_DLL AutoSeeded_RNG : public RandomNumberGenerator
  {
  public:
    void randomize(byte out[], u32bit len)
    { rng->randomize(out, len); }           // SEGV on this line.
    bool is_seeded() const
    { return rng->is_seeded(); }
    void clear() throw() { rng->clear(); }
    std::string name() const
    { return "AutoSeeded(" + rng->name() + ")"; }

    void reseed(u32bit poll_bits = 256) { rng->reseed(poll_bits); }
    void add_entropy_source(EntropySource* es)
    { rng->add_entropy_source(es); }
    void add_entropy(const byte in[], u32bit len)
    { rng->add_entropy(in, len); }

    AutoSeeded_RNG(u32bit poll_bits = 256);
    ~AutoSeeded_RNG() { delete rng; }
  private:
    RandomNumberGenerator* rng;
  };
4

3 に答える 3

3

Cygwin アプリはマルチスレッド化されています (たとえば、1 つのスレッドがシグナル リスナー スレッドです)。gdb で使用info threadsして、実際に障害が発生したスレッドを見つけます。

于 2011-02-21T08:09:45.033 に答える
1

gdbをプロアクティブにアタッチし、失敗しているコンストラクター呼び出しの直前にブレークポイントを設定してから、シングルステップスルーすることができます。

于 2011-02-21T04:51:55.587 に答える
1

新しいコードに基づくと、3 つのルールに違反しており、これが問題の原因である可能性があります。

生のポインターを使用してクラスを定義し、正しいコピー コンストラクターを提供しない (またはアクセスできないようにする) と、ダブルフリーになる可能性があります。

コピー コンストラクターを追加します。または、プロジェクトのバグ トラッカーで問題を開きます。最新バージョンを使用していますよね?

于 2011-02-21T18:40:27.400 に答える