Androidデバッガはローカル変数を隠します -- java フィールド と android フィールド と debugging フィールド と undefined-behavior フィールド 関連 問題

Android debugger hides local variable












14
vote

問題

日本語

次のコードを実行するときに、Androidのデバッガを使用して奇妙な動作をしています。変数は、ウィジェットによって初期化された直後に消えます。私はそれを見るためにそれを移動しましたが、それは 9988777664 と言います。 For LoopまたはInsideの前に、変数を配置する場所は関係ません。私はコードで見ることができるように変数を印刷し、 "value is null" と表示されますが、 if (value == null) でチェックしても停止しないとエラーが発生しないそれは整数に。

コード:

<事前> <コード> for (int i=0; i < (view != null ? ((ViewGroup)view).getChildCount() : 0); i++) { // Get name of the widget for example field__id, // Convert to field name replacing field__id for id // or for example field_name to name // Check if the field exists in the column name, if so, add the ContentValue View widget = ((ViewGroup)view).getChildAt(i); String widgetName = view.getResources().getResourceEntryName(widget.getId()); String fieldName = widgetName.replace(Model.fieldPrefix,""); Object value = null; if (columnNames.contains(fieldName)) { // TableField on the table matches the field on the form try { if (widget instanceof TextView) { value = ((TextView) widget).getText().toString(); } else if (widget instanceof Spinner) { value = ((SpinnerRow) ((Spinner) widget).getSelectedItem()).getId(); } else if (widget instanceof DatePicker) { String date = AppDatabase.formatDateTime( getContext(), ((DatePicker) widget).getYear() + "-" + ((DatePicker) widget).getMonth() + "-" + ((DatePicker) widget).getDayOfMonth()); contentValues.put(fieldName, date ) ; } else { throw new ClassCastException("Could not cast the widget"+widget.getClass().toString()); } Log.d(AppController.DEBUG_TAG, "Widget "+widgetName+" value is " + value.toString()); } catch (NullPointerException e) { // Ignore exception: value = null; } TableField tableField = this.getTable().getFieldByName(fieldName); if ( (tableField.isPrimaryKey() && (value.equals("-1") || value.equals(""))) || !tableField.getNotNull() && value.toString().length()==0 ) value = null; if ( value == null || tableField.getType() == SQLiteCursor.FIELD_TYPE_NULL ) { contentValues.putNull(fieldName); } else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_STRING || tableField.getType() == SQLiteCursor.FIELD_TYPE_VARCHAR) { contentValues.put(fieldName, String.valueOf(value)); } else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_INTEGER) { contentValues.put(fieldName, Integer.valueOf(value.toString()) ); } else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_FLOAT) { contentValues.put(fieldName,Float.valueOf(value.toString())); } else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_BLOB) { contentValues.put(fieldName,String.valueOf(value)); } } }
英語

I have a weird behavior using Android's debugger when executing the following code. The variable value disappears just after it has been initialized by the widget. I moved it to to watches but it says "Cannot find local variable value". It does not matter where I place the variable, before the for loop or inside, it behaves the same no matter what. I also printed the variable as you can see in the code and it says "value is null" but when I check it by if (value == null) it does not stop and finally throws an error when trying to cast it to an integer.

The code:

    for (int i=0; i < (view != null ? ((ViewGroup)view).getChildCount() : 0); i++)     {         // Get name of the widget for example field__id,         // Convert to field name replacing field__id for id         // or for example field_name to name         // Check if the field exists in the column name, if so, add the ContentValue         View widget = ((ViewGroup)view).getChildAt(i);         String widgetName = view.getResources().getResourceEntryName(widget.getId());         String fieldName = widgetName.replace(Model.fieldPrefix,"");         Object value = null;          if (columnNames.contains(fieldName)) {             // TableField on the table matches the field on the form             try {                 if (widget instanceof TextView) {                     value = ((TextView) widget).getText().toString();                 } else if (widget instanceof Spinner) {                     value = ((SpinnerRow) ((Spinner) widget).getSelectedItem()).getId();                 } else if (widget instanceof DatePicker) {                     String date = AppDatabase.formatDateTime( getContext(), ((DatePicker) widget).getYear() + "-" + ((DatePicker) widget).getMonth() + "-" + ((DatePicker) widget).getDayOfMonth());                     contentValues.put(fieldName, date ) ;                 } else {                     throw new ClassCastException("Could not cast the widget"+widget.getClass().toString());                 }                 Log.d(AppController.DEBUG_TAG, "Widget "+widgetName+" value is " + value.toString());              } catch (NullPointerException e) {                 // Ignore exception:                 value = null;             }              TableField tableField = this.getTable().getFieldByName(fieldName);              if ( (tableField.isPrimaryKey() && (value.equals("-1") || value.equals("")))                     || !tableField.getNotNull() && value.toString().length()==0  )                 value = null;              if ( value == null || tableField.getType() == SQLiteCursor.FIELD_TYPE_NULL ) {                 contentValues.putNull(fieldName);             } else  if (tableField.getType() == SQLiteCursor.FIELD_TYPE_STRING || tableField.getType() == SQLiteCursor.FIELD_TYPE_VARCHAR) {                 contentValues.put(fieldName, String.valueOf(value));             } else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_INTEGER) {                 contentValues.put(fieldName, Integer.valueOf(value.toString()) );             } else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_FLOAT) {                 contentValues.put(fieldName,Float.valueOf(value.toString()));             } else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_BLOB) {                 contentValues.put(fieldName,String.valueOf(value));             }          }      } 
</div
           
         
         

回答リスト

13
 
vote

あなたは難読化を伴うプローガードを使いますか?

yesの場合、それは問題である可能性があります -

でそれを無効にする <事前> <コード> var icons = ["http://maps.google.com/mapfiles/ms/icons/yellow.png", "http://maps.google.com/mapfiles/ms/icons/red.png", ...etc ]; 2

Proguard規則(通常Proguard-rules.txt、build.gradleファイルでProguard Configをチェックしてください。

<事前> <コード> var icons = ["http://maps.google.com/mapfiles/ms/icons/yellow.png", "http://maps.google.com/mapfiles/ms/icons/red.png", ...etc ]; 3
 

Do you use proguard with obfuscation?

If yes, that might be the problem - disable it with

-dontobfuscate 

which you should put in your file with proguard rules (usually proguard-rules.txt, check your proguard config in the build.gradle file, like in the example below:

buildTypes {         debug {             runProguard true             zipAlign true             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'             signingConfig signingConfigs.debug             testCoverageEnabled true         } } 
</div
 
 
 
 
8
 
vote

私は同じ問題を抱えていました。最後に、Gradleビルドファイルから 'TestCoverageEnabled True'を削除して解決しました。

 

I had the same problem. Finally, resolved by removing 'testCoverageEnabled true' from gradle build file.

</div
 
 
 
 
6
 
vote

後の version 1.0.1

で解決されているgradle version 1.0.0 のバグによる同様の問題

build.gradle ファイルにある 'com.android.tools.build:gradle:1.0.0' にプロジェクトを検索します。モジュールを含めている場合は、複数の build.gradle ファイルがある場合があります。

あなたが持っているたびに:

'com.android.tools.build:1.0.0'

それを変更する:

'com.android.tools.build:gradle:1.0.1'

その後卒業します。 Android Studioは、新しいGradle Jarファイルをダウンロードしてそれをコンパイルします。

 

A similar problem caused by a bug in the gradle version 1.0.0 which has beed solved in a later version 1.0.1

Search your project for 'com.android.tools.build:gradle:1.0.0' which will be found in build.gradle files. you may have more than one build.gradle file if you are including modules.

whenever you have:

'com.android.tools.build:gradle:1.0.0'

Change it to:

'com.android.tools.build:gradle:1.0.1'

Then sync gradle. Android Studio will download the new gradle jar file and compiles with it.

</div
 
 
4
 
vote

ここで同じ問題を持つ:<コード> Cannot find local variable '[variable_name]' 、唯一の違いは、私のアプリが完全にデバッガ可能であるため、この問題はライブラリコードで発生します。

minifyEnabled false minifyEnabled false は、ライブラリ app モジュールの両方で debug buildTypes を持っています。また、デバッグ中に、 Build Variant は、両方のモジュールの<コード> debug です。生成された version 1.0.10 でさえ正しい値:

<コード> version 1.0.11

原因

gradeは、アプリケーションのビルドタイプ(デバッグまたはリリース)を依存ライブラリに伝播しません。どのビルドタイプがアプリケーションで選択されていても、常にライブラリのビルドを使用しています(ライブラリ依存関係は、アプリのbuild.gradleで version 1.0.13 として指定されています)。

minifyEnabled false12

溶液

version 1.0.14 ライブラリモジュール

<事前> <コード> version 1.0.15

minifyEnabled false16 app モジュール

<事前> <コード> version 1.0.17

を行う代わりに:

<事前> <コード> version 1.0.18

href="https://i.stack.imgur.com/zxssj.jpg" rel="nofollow noreferrer"> issue screenshot

 

Having the same problem here: Cannot find local variable '[variable_name]', and the only difference is that my app is fully debuggable, while the issue occurs with the library code.

I have minifyEnabled false for debug buildTypes in both library and app modules. And during debugging, the Build Variant are debug for both modules as well. Even the generated BuildConfig.java has the correct value:

public static final boolean DEBUG = Boolean.parseBoolean("true");

Cause:

Gradle doesn't propagate build type (debug or release) of application to its dependent library. It always uses release build of library no matter which build type is chosen in application (the library dependency is specified as compile project(':library') in the app's build.gradle).

Solution:

build.gradle in library module

android {     defaultConfig {         defaultPublishConfig 'release'         publishNonDefault true     } } 

build.gradle in app module

dependencies {     debugCompile project(path: ':library', configuration: "debug")     releaseCompile project(path: ':library', configuration: "release") } 

instead of doing:

compile project(':library') 

issue screenshot

</div
 
 
2
 
vote

ビルドが Jack Toolchain を使用する場合は、問題の原因になる可能性があります。私の場合では、ジャックを無効にする問題を解決します。

<事前> <コード> version 1.0.19

注:1.8ソースの互換性にはジャックが必要です。

 

If your build uses the jack toolchain this can be the source of the problem. In my case, disabling jack solves the problem:

buildTypes { ...     debug {         jackOptions {             enabled false         }     } } 

Note: 1.8 source compatibility requires jack!

</div
 
 
0
 
vote

これは私のために働いたものです。 Proguardとともに使用すると、Android Studioはローカル変数データを表示できません。

デバッグ中に使用する必要があります。

1

proguard-rules.proファイルの下のdonotobfuscateプロパティを追加する - dontobfuscate または

2;

build.grade内のdebug buildtypesの下で、 minifyEnabled false ShrinkResources false

後者のオプションは、ur production apkが圧縮される必要があるので、より推奨されています。

<事前> <コード> 'com.android.tools.build:gradle:1.0.0'0
 

This is what worked for me. Android studio cannot show local variable data when used with Proguard.

Following settings need to be used during debugging:

1.

Either add -donotobfuscate property under proguard-rules.pro file, -dontobfuscate OR

2.

Under debug buildtypes inside build.grade, minifyEnabled false shrinkResources false

Latter option is more recommended as ur production apk many need to be compressed.

buildTypes {     debug {         applicationIdSuffix '.debug'         versionNameSuffix '-DEBUG'         minifyEnabled false         shrinkResources false         proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'     }     release {         minifyEnabled true         shrinkResources true         proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'         signingConfig signingConfigs.release     } } 
</div
 
 
0
 
vote

も同様の問題を抱えていた。 Android Studioで使用されるKotlinとApp-Level 998877621 ファイル(おそらくAndroid Studio Update)で宣言されているものとの間のバージョンの不一致でした。 'com.android.tools.build:gradle:1.0.0'2 にバージョンをバンピングしました。

 

Had a similar problem. It was version mismatch between Kotlin used in Android Studio and the one declared in app-level build.gradle file (probably after Android Studio update). Bumping the version in build.gradle helped.

</div
 
 
-1
 
vote

uh ...私の場合は、それを修正するためにプロジェクトを再構築するだけです!

 

uh... In my case,I just rebuild project to fix it!

</div
 
 

関連する質問

8  この使用はSTD :: Array未定義の行動ですか? [複製]  ( Is this use of stdarray undefined behavior ) 
この質問はすでにここで回答を持っています 閉じる 8年前> 可能な重複: を使用して、不明なプリミティブ型の値を保持しています。これは、10バイト以下の長さの長さです。 <コード> std::array<char, 10> val...

13  C標準ライブラリの拡張性はC ++プログラムにどのくらい影響しますか?  ( How much does the c standard library extensibility affect c programs ) 
このコードを取る: <事前> <コード> int issuecode(int i) { return 2 * i; } int main(int argc, char **argv) { return issuecode(argc); } 理解し...

4  参照がそれ自体を指すように宣言されている場合はどうなりますか?例えば。 int&x = x。  ( What if a reference is declared to point to itself e g int x x ) 
次のコードは g++ バージョン10.1.0:で正常にコンパイルされます。 <コード> int main() { int& x = x; return x; } コンパイラでもこのために定義された警告があり、意図的ではないことを示唆して...

6  使用していない場合は、アレイの外側のデータにアクセスしていますか?  ( Is accessing data outside an array incorrect if you dont use it ) 
私が書いているアルゴリズムでは、次の(もちろん簡素化)にすることができます。 <事前> <コード> int a[3] = {1,2,3}; int b = a[3]; <コード> b オーバーフローに使用するインデックスがの値を使用しない場合は、bの値を...

3  Punning Type Punning UBがあるのはなぜですか?  ( Why is type punning considered ub ) 
これを想像してみてください: <事前> <コード> uint64_t x = *(uint64_t *)((unsigned char[8]){'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}); 私はそのタイプの句が未定義の...

56  初期化はLValue-to-rvalue変換を伴うことですか? `int x = x;` UB?  ( Does initialization entail lvalue to rvalue conversion is int x x ub ) 
C ++規格には、「驚くべき」名検索の3.3.2、「宣言のポイント」:の半辺の例が含まれています。 <事前> <コード> int x = x; x をそれ自体で初期化します。これは、(プリミティブ型)は未初期化のものであり、したがって不定値(自動変数...

148  Enhanced GCC 6オプティマイザが実用的なC ++コードを破るのはなぜですか?  ( Why does the enhanced gcc 6 optimizer break practical c code ) 
GCC 6には、新しいオプティマイザ機能があります。<コード> this 常にNULLではなく、それに基づいて最適化されていません。 値範囲伝播は、C ++メンバ関数のこのポインタがnull以外であると仮定しています。これにより、一般的なNULLポインタ...

0  'class'がc互換ではないため、コードがクラッシュする可能性がありますか?  ( My code may be crashing because the class isnt c compatible ) 
求め - 私はそれを絞り込みました。 再現可能:なぜC内のこのオブジェクトを渡すのはなぜですか私のコード? 私のアプリは変更した後に正しく機能していません。私はMSVCで警告を受けましたが、GCCではありません。 警告のリポジトリを探します。 警告C41...

6  intを返すように宣言された関数は何も返しません。この未定義の行動は?  ( A function declared to return int returns nothing is this undefined behavior ) 
これはC ++の有効な関数です: <事前> <コード> int f() { if(false) { return 42; } } 次の定義によりUB: <事前> <コード> int x = f(); //return valu...

5  カスタムアロケータから提供されている生メモリへのポインタを操作する方法(UBなし)?  ( How to work with pointers into raw memory provided by custom allocators without ) 
アロケータ対応コンテナを書き込もうとしています。 3つのオブジェクトのメモリのチャンクを割り当てたいとします。 <事前> <コード> T* chunk = std::allocator_traits<Allocator>::allocate(allocator...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有