仕事でのこの小さなミスのおかげで、私は有名な新人テスト エンジニアになりました。

arm の産業用コンピュータのパイロットテスト中に、データが到着すると産業用コンピュータのインターフェイスがスタックすることがわかり、テスターもこの問題を抱えているはずで、ログを確認したところ、セグメント エラーであり、同じコード位置でエラーが何度も発生していました。

週末を除けば丸一日以上かかって問題は解決し、技術的に難しい問題はなかったものの、その過程は記録に値するものでした。

起因

先週の金曜日の朝、テスターがパイロット プロジェクトに向かう途中で、ソフトウェア バージョンを更新したいと電話してきたので、コード ツリー上の最新リリース ブランチをプルしました。arm コンパイル環境がないという事実に基づいて、私はそれをパッケージ化して彼に送り、テスト マシンでコンパイルしてテストしてもらいました。

後で知ったのですが、現時点ではコンパイルとテストを統合した唯一のオールインワン マシンです。コンパイル後、アップデート方法を案内 昼近くにセグメントエラーがあったとの報告があり、他の用事があったため、午後はログを探すだけでした。私はそのプロジェクトに参加していなかったので、担当の開発者に見てもらった

調査の結果、問題は初期化ステートメント std::string foobar = ""; にあり、4 つの目はそれを長い間分析しましたが、結論は出ませんでした。議論の後、パイロット マシンは元に戻され、実験室で再現され、追跡およびデバッグが行われました。

トラブルシューティングと解決

問題を特定する

テスターに​​相談すると、実験室で同じシーンをテストしたときに問題は発生しなかったというフィードバックが得られました。ラボはすべて x86 マシンなのでエラーは発生せず、印刷とデバッグのみが可能です。

まず、コードのエラー行の前にいくつかのステートメントを追加してテストし、エラー行番号が変更されていても、まだ文字列ステートメントを指していることを確認します。コードをよく観察すると、関数の後に文字列型変数が別の配列(char buff[])に代入されているので、配列の容量が足りないのではないかと思い、組み立てられた文字列変数の長さを出力してみると、配列の長さを超えていることがわかります。長さを増やしてテストすると、すべてうまくいきます。プロジェクトに同梱されているlog関数を使って印刷すると、URLアドレスの中国語出力が文字化けしていましたが、printfでは正常に出力されました。

URL エスケープは、curl ライブラリ関数curl_easy_escape を呼び出すことで実現されます。漢字にはパーセント記号 % が付きます。ログ関数のカプセル化の問題であると考えられます。時間の制約のため、これ以上の調査は行われません。しかし、それは隠れた危険性である可能性があり、それについては今後議論される予定です。

解決

最後に組み立てられたバッファ配列の容量を増やすだけです。

コードを再現する

以下は、問題を強調するために無関係なコードを破棄して、実際のプロジェクトの関数レイアウトをシミュレートしています。

注: 最終出力は範囲外になります。

#include <stdlib.h>
#include <stdio.h>


#include <string>


int main()
{
    
    
    const char* url = "http://172.168.168.188:18080/api/new/v2/queryAVeryloongApiforveryloongremoteipserver?";
    char foo1[256]={
    
    0};
    
    int a = 100;
    int b = 1;
    int c = a+b+1+1+b+3+a;
    
    std::string strData = "";
    
    for (int i=0; i < 3; i++)
    {
    
    
        strData.append("&");
        strData.append("10000");
        strData.append("=");
        strData.append("103");
    }
    char output[96]={
    
    0};
    
    sprintf(output, "%s?%s", url, strData.c_str());
    printf("url=%s\n", output);
   
    return 0;
}

テストした結果、x86 だけが正常で、他の 2 つのプラットフォームはセグメンテーション違反になっています。長年の実践の直観では、x86 は正常に見えるはずですが、実際には異常である (範囲外に違いない) のですが、このように使用されており、不可解です。

x86 産業用コンピューターでのテスト結果:

$ file a.out 
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=3e7c0c704230b08e49f529a6924397e0dfd358ba, not stripped


$ ./a.out 
url=http://172.168.168.188:18080/api/new/v2/queryAVeryloongApiforveryloongremoteipserver??&10000=103&10000=103&10000=103

arm 産業用コンピューターでのテスト結果:

$ file a.out 
a.out: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.7.0, not stripped


$ ./a.out 
url=http://172.168.168.188:18080/api/new/v2/queryAVeryloongApiforveryloongremoteipserver??&10000=103&10000=103&10000=103
段错误(吐核)

loongarch 産業用コンピューターでのテスト結果:

$ file a.out 
a.out: ELF 64-bit LSB executable, LoongArch-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld.so.1, for GNU/Linux 4.15.0, BuildID[sha1]=7d61ce6d3a50850e045dcdaab48585f88bbca4f7, not stripped


$ ./a.out 
url=http://172.168.168.188:18080/api/new/v2/queryAVeryloongApiforveryloongremoteipserver??&10000=103&10000=103&10000=103
总线错误

まとめ

最近断続的にローカリゼーション適応に触れることが多くなり、少し警戒しています。

マクロ定義を変更してクロスコンパイルすればいいと考える多くの人とは異なり、私は適応についてあまり楽観的ではありません。上記のことは3日や2日もあればできると思われがちですが、実際には非常に面倒です。同じコードが異なるアーキテクチャ (x86 と arm、mips) で同じように動作するとは限りません。

現時点での最大の問題は次のとおりです。

多くのエンジニアリング コードは数年前のものであり、一部の機能はもはやテストできず、一部のコードは当時のサードパーティのバージョンを使用しているため、性急に更新したり、新しいオペレーティング システムや新しいコンパイラを使用したりすると、コンパイルが失敗する可能性があります。

マクロ定義を変更するのは確かに簡単ですが、エンジニアリング コードでは、システム ディジットとシステム アーキテクチャという 2 つの異なる概念に区別がないため、十分に注意してください。たとえば、ポインタの長さは 32 ビット システムと 64 ビット システムでは異なる値になります。

コードにはセグメンテーション違反などの隠れたバグがあります。一方で、アーキテクチャ プラットフォームが異なれば、個々のセグメンテーション違反の種類の処理方法も異なります (この記事で発生した問題など、x86 には存在しません)。条件なしで適切にテストすることは困難です。一方で、コードのレビューを明示的に確認するのは難しい場合があります。

プロジェクト コードにはコンパイル警告が多数ありますが、誰も修正していないようです。著者の経験から言えば、警告を修正すると隠れた危険も生じる可能性があります。

最後に:熱心なファンに恩返しするために、完全なソフトウェア テスト ビデオ学習チュートリアルを作成しました。必要な場合は、無料で入手できます。【保证100%免费】
ここに画像の説明を挿入

ソフトウェアテストの面接ドキュメント

「私たちは高給の仕事を見つけるために勉強しなければなりません。以下の面接の質問は、アリババ、テンセント、バイトなどの一流インターネット企業の最新の面接資料であり、一部のバイトの上司が権威ある回答をしています。この一連の面接資料を読めば、誰もが満足のいく仕事を見つけることができると信じています。」

ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/m0_67695717/article/details/131817783