mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-06-29 21:09:50 +00:00
dev: more logging features to catch WalletInfo.hive getting corrupted
This commit is contained in:
parent
9c8d22842a
commit
308a196fc6
8 changed files with 145 additions and 2 deletions
|
@ -4,7 +4,7 @@ import 'package:flutter/foundation.dart';
|
||||||
|
|
||||||
String? printVLogFilePath;
|
String? printVLogFilePath;
|
||||||
|
|
||||||
void printV(dynamic content) {
|
void printV(dynamic content, {bool separateMultiline = false}) {
|
||||||
CustomTrace programInfo = CustomTrace(StackTrace.current);
|
CustomTrace programInfo = CustomTrace(StackTrace.current);
|
||||||
final logMsg = "${programInfo.fileName}#${programInfo.lineNumber}:${programInfo.columnNumber} ${programInfo.callerFunctionName}: $content";
|
final logMsg = "${programInfo.fileName}#${programInfo.lineNumber}:${programInfo.columnNumber} ${programInfo.callerFunctionName}: $content";
|
||||||
if (printVLogFilePath != null) {
|
if (printVLogFilePath != null) {
|
||||||
|
@ -14,7 +14,14 @@ void printV(dynamic content) {
|
||||||
print("Unable to write to log file (printV): $e");
|
print("Unable to write to log file (printV): $e");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
print(logMsg);
|
if (separateMultiline) {
|
||||||
|
final lines = content.toString().split("\n");
|
||||||
|
for (final s in lines) {
|
||||||
|
print("${programInfo.fileName}#${programInfo.lineNumber}:${programInfo.columnNumber} ${programInfo.callerFunctionName}: $s");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
print(logMsg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://stackoverflow.com/a/59386101
|
// https://stackoverflow.com/a/59386101
|
||||||
|
|
|
@ -111,6 +111,7 @@ class $BackupService {
|
||||||
|
|
||||||
Future<void> verifyWallets() async {
|
Future<void> verifyWallets() async {
|
||||||
final walletInfoSource = await reloadHiveWalletInfoBox();
|
final walletInfoSource = await reloadHiveWalletInfoBox();
|
||||||
|
printV("WalletInfoSource length (backup service): ${walletInfoSource.length}");
|
||||||
correctWallets =
|
correctWallets =
|
||||||
walletInfoSource.values.where((info) => availableWalletTypes.contains(info.type)).toList();
|
walletInfoSource.values.where((info) => availableWalletTypes.contains(info.type)).toList();
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:ui';
|
import 'dart:ui';
|
||||||
import 'package:cake_wallet/anonpay/anonpay_invoice_info.dart';
|
import 'package:cake_wallet/anonpay/anonpay_invoice_info.dart';
|
||||||
|
@ -205,8 +206,31 @@ Future<void> initializeAppConfigs({bool loadWallet = true}) async {
|
||||||
encryptionKey: transactionDescriptionsBoxKey);
|
encryptionKey: transactionDescriptionsBoxKey);
|
||||||
final trades = await CakeHive.openBox<Trade>(Trade.boxName, encryptionKey: tradesBoxKey);
|
final trades = await CakeHive.openBox<Trade>(Trade.boxName, encryptionKey: tradesBoxKey);
|
||||||
final orders = await CakeHive.openBox<Order>(Order.boxName, encryptionKey: ordersBoxKey);
|
final orders = await CakeHive.openBox<Order>(Order.boxName, encryptionKey: ordersBoxKey);
|
||||||
|
|
||||||
|
var lsofProcess = await Process.start(
|
||||||
|
"/system/bin/lsof",
|
||||||
|
["walletinfo.hive", "walletinfo.lock"],
|
||||||
|
workingDirectory: (await getAppDir()).path,
|
||||||
|
runInShell: true,
|
||||||
|
);
|
||||||
|
|
||||||
|
printV("exitcode: ${await lsofProcess.exitCode}");
|
||||||
|
printV("__stderr: ${await lsofProcess.stderr.transform(utf8.decoder).join()}", separateMultiline: true);
|
||||||
|
printV("__stdout: ${await lsofProcess.stdout.transform(utf8.decoder).join()}", separateMultiline: true);
|
||||||
|
|
||||||
final walletInfoSource = await CakeHive.openBox<WalletInfo>(WalletInfo.boxName);
|
final walletInfoSource = await CakeHive.openBox<WalletInfo>(WalletInfo.boxName);
|
||||||
printV("WalletInfoSource length (initializeAppConfigs): ${walletInfoSource.length}");
|
printV("WalletInfoSource length (initializeAppConfigs): ${walletInfoSource.length}");
|
||||||
|
|
||||||
|
lsofProcess = await Process.start(
|
||||||
|
"/system/bin/lsof",
|
||||||
|
["walletinfo.hive", "walletinfo.lock"],
|
||||||
|
workingDirectory: (await getAppDir()).path,
|
||||||
|
runInShell: true,
|
||||||
|
);
|
||||||
|
printV("exitcode: ${await lsofProcess.exitCode}");
|
||||||
|
printV("__stderr: ${await lsofProcess.stderr.transform(utf8.decoder).join()}", separateMultiline: true);
|
||||||
|
printV("__stdout: ${await lsofProcess.stdout.transform(utf8.decoder).join()}", separateMultiline: true);
|
||||||
|
|
||||||
final templates = await CakeHive.openBox<Template>(Template.boxName);
|
final templates = await CakeHive.openBox<Template>(Template.boxName);
|
||||||
final exchangeTemplates = await CakeHive.openBox<ExchangeTemplate>(ExchangeTemplate.boxName);
|
final exchangeTemplates = await CakeHive.openBox<ExchangeTemplate>(ExchangeTemplate.boxName);
|
||||||
final anonpayInvoiceInfo = await CakeHive.openBox<AnonpayInvoiceInfo>(AnonpayInvoiceInfo.boxName);
|
final anonpayInvoiceInfo = await CakeHive.openBox<AnonpayInvoiceInfo>(AnonpayInvoiceInfo.boxName);
|
||||||
|
|
|
@ -37,6 +37,7 @@ import 'package:cake_wallet/src/screens/dashboard/pages/nft_details_page.dart';
|
||||||
import 'package:cake_wallet/src/screens/dashboard/pages/transactions_page.dart';
|
import 'package:cake_wallet/src/screens/dashboard/pages/transactions_page.dart';
|
||||||
import 'package:cake_wallet/src/screens/dashboard/sign_page.dart';
|
import 'package:cake_wallet/src/screens/dashboard/sign_page.dart';
|
||||||
import 'package:cake_wallet/src/screens/dev/hash_change_logs_page.dart';
|
import 'package:cake_wallet/src/screens/dev/hash_change_logs_page.dart';
|
||||||
|
import 'package:cake_wallet/src/screens/dev/lsof.dart';
|
||||||
import 'package:cake_wallet/src/screens/dev/monero_background_sync.dart';
|
import 'package:cake_wallet/src/screens/dev/monero_background_sync.dart';
|
||||||
import 'package:cake_wallet/src/screens/dev/moneroc_call_profiler.dart';
|
import 'package:cake_wallet/src/screens/dev/moneroc_call_profiler.dart';
|
||||||
import 'package:cake_wallet/src/screens/dev/print_verbose_logs_page.dart';
|
import 'package:cake_wallet/src/screens/dev/print_verbose_logs_page.dart';
|
||||||
|
@ -928,6 +929,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
|
||||||
case Routes.devPrintVerbose:
|
case Routes.devPrintVerbose:
|
||||||
return MaterialPageRoute<void>(builder: (_) => PrintVerboseLogsPage());
|
return MaterialPageRoute<void>(builder: (_) => PrintVerboseLogsPage());
|
||||||
|
|
||||||
|
case Routes.devLsof:
|
||||||
|
return MaterialPageRoute<void>(builder: (_) => DevLsof());
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return MaterialPageRoute<void>(
|
return MaterialPageRoute<void>(
|
||||||
builder: (_) => Scaffold(
|
builder: (_) => Scaffold(
|
||||||
|
|
|
@ -120,6 +120,7 @@ class Routes {
|
||||||
static const devBackgroundSyncLogs = '/dev/background_sync_logs';
|
static const devBackgroundSyncLogs = '/dev/background_sync_logs';
|
||||||
static const devHashChangeLogs = '/dev/hash_change_logs';
|
static const devHashChangeLogs = '/dev/hash_change_logs';
|
||||||
static const devPrintVerbose = '/dev/print_verbose';
|
static const devPrintVerbose = '/dev/print_verbose';
|
||||||
|
static const devLsof = '/dev/lsof';
|
||||||
|
|
||||||
static const signPage = '/sign_page';
|
static const signPage = '/sign_page';
|
||||||
static const connectDevices = '/device/connect';
|
static const connectDevices = '/device/connect';
|
||||||
|
|
63
lib/src/screens/dev/lsof.dart
Normal file
63
lib/src/screens/dev/lsof.dart
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
import 'package:cake_wallet/src/screens/base_page.dart';
|
||||||
|
import 'package:cake_wallet/view_model/dev/lsof_view_model.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||||
|
|
||||||
|
class DevLsof extends BasePage {
|
||||||
|
final LsofViewModel viewModel = LsofViewModel();
|
||||||
|
|
||||||
|
DevLsof() {
|
||||||
|
viewModel.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String? get title => "[dev] lsof";
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget? trailing(BuildContext context) {
|
||||||
|
return IconButton(
|
||||||
|
icon: Icon(Icons.refresh),
|
||||||
|
onPressed: () => viewModel.refresh(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget body(BuildContext context) {
|
||||||
|
return Observer(
|
||||||
|
builder: (_) {
|
||||||
|
if (viewModel.logs == null) {
|
||||||
|
return Center(child: CircularProgressIndicator());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (viewModel.logs == "") {
|
||||||
|
return Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Text("No logs loaded"),
|
||||||
|
SizedBox(height: 16),
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () => viewModel.refresh(),
|
||||||
|
child: Text("Load Logs"),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Center(
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
SelectableText(
|
||||||
|
viewModel.logs??'',
|
||||||
|
style: TextStyle(fontSize: 8),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,5 @@
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:cake_wallet/bitcoin/bitcoin.dart';
|
import 'package:cake_wallet/bitcoin/bitcoin.dart';
|
||||||
import 'package:cake_wallet/entities/priority_for_wallet_type.dart';
|
import 'package:cake_wallet/entities/priority_for_wallet_type.dart';
|
||||||
import 'package:cake_wallet/generated/i18n.dart';
|
import 'package:cake_wallet/generated/i18n.dart';
|
||||||
|
@ -10,6 +12,7 @@ import 'package:cake_wallet/src/screens/settings/widgets/settings_version_cell.d
|
||||||
import 'package:cake_wallet/utils/feature_flag.dart';
|
import 'package:cake_wallet/utils/feature_flag.dart';
|
||||||
import 'package:cake_wallet/view_model/settings/other_settings_view_model.dart';
|
import 'package:cake_wallet/view_model/settings/other_settings_view_model.dart';
|
||||||
import 'package:cw_core/wallet_type.dart';
|
import 'package:cw_core/wallet_type.dart';
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||||
|
|
||||||
|
@ -105,6 +108,12 @@ class OtherSettingsPage extends BasePage {
|
||||||
handler: (BuildContext context) =>
|
handler: (BuildContext context) =>
|
||||||
Navigator.of(context).pushNamed(Routes.devPrintVerbose),
|
Navigator.of(context).pushNamed(Routes.devPrintVerbose),
|
||||||
),
|
),
|
||||||
|
if (kDebugMode && Platform.isAndroid)
|
||||||
|
SettingsCellWithArrow(
|
||||||
|
title: '[dev] lsof',
|
||||||
|
handler: (BuildContext context) =>
|
||||||
|
Navigator.of(context).pushNamed(Routes.devLsof),
|
||||||
|
),
|
||||||
Spacer(),
|
Spacer(),
|
||||||
SettingsVersionCell(
|
SettingsVersionCell(
|
||||||
title: S.of(context).version(_otherSettingsViewModel.currentVersion)),
|
title: S.of(context).version(_otherSettingsViewModel.currentVersion)),
|
||||||
|
|
34
lib/view_model/dev/lsof_view_model.dart
Normal file
34
lib/view_model/dev/lsof_view_model.dart
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:cw_core/root_dir.dart';
|
||||||
|
import 'package:flutter_daemon/flutter_daemon.dart';
|
||||||
|
import 'package:mobx/mobx.dart';
|
||||||
|
|
||||||
|
part 'lsof_view_model.g.dart';
|
||||||
|
class LsofViewModel = LsofViewModelBase with _$LsofViewModel;
|
||||||
|
|
||||||
|
abstract class LsofViewModelBase with Store {
|
||||||
|
@observable
|
||||||
|
String? logs = null;
|
||||||
|
|
||||||
|
@action
|
||||||
|
Future<void> refresh() async {
|
||||||
|
final dir = await getAppDir();
|
||||||
|
final list = await dir.list(recursive: true);
|
||||||
|
final fList = await list.map((element) => element.path).toList();
|
||||||
|
|
||||||
|
var lsofProcess = await Process.start(
|
||||||
|
"/system/bin/lsof", fList,
|
||||||
|
// ["walletinfo.hive", "walletinfo.lock"],
|
||||||
|
workingDirectory: (await getAppDir()).path,
|
||||||
|
runInShell: true,
|
||||||
|
);
|
||||||
|
|
||||||
|
logs = '''exitcode: ${await lsofProcess.exitCode}
|
||||||
|
stderr: ${await lsofProcess.stderr.transform(utf8.decoder).join()}
|
||||||
|
stdout: ${await lsofProcess.stdout.transform(utf8.decoder).join()}
|
||||||
|
''';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue