এই নির্দেশিকাটি এসডিভি প্ল্যাটফর্মে চালিত সার্ভিস ও অ্যাপ্লিকেশন ডিবাগ করার জন্য প্রয়োজনীয় টুলস এবং কৌশলগুলোর একটি সংক্ষিপ্ত বিবরণ প্রদান করে।
ডিভাইসের সাথে সংযোগ করুন
ডিভাইসের সাথে সংযোগ স্থাপন এবং এটি ব্যবহারের প্রধান মাধ্যম হলো অ্যান্ড্রয়েড ডিবাগ ব্রিজ (adb) । নিশ্চিত করুন যে adb আপনার সিস্টেমের পাথে (path) আছে।
নেটওয়ার্ক ব্যবহার করে সংযোগ করুন
ডিভাইসটি যদি একই নেটওয়ার্কে থাকে এবং আপনি এর আইপি অ্যাড্রেস জানেন, তবে ইথারনেটের মাধ্যমে সংযোগ করতে পারেন। আমাদের সিস্টেম adb-এর জন্য শুধুমাত্র নেটওয়ার্ক সংযোগ ব্যবহার করে:
# Connect to the device using its IP address and default port
adb connect <device_ip_address>:5555
একাধিক ডিভাইসের সাথে সংযোগ করুন
একটিমাত্র ওয়ার্কস্টেশন থেকে একাধিক ডিভাইস পরিচালনা করতে, আপনি বিভিন্ন আইপি অ্যাড্রেসের মাধ্যমে সেগুলিতে সংযোগ করতে পারেন। যদি আপনি একটিমাত্র হোস্টে একাধিক ভিএম (VM) চালান, তবে আপনাকে প্রতিটি ডিভাইসের জন্য আলাদা পোর্ট বরাদ্দ করতে হবে। এর জন্য প্রতিটি এসডিভি (SDV) ডিভাইসে এডিবি (adb) ডেমনকে একটি অনন্য পোর্টে শোনার জন্য কনফিগার করতে হবে, যেমন, প্রথম ডিভাইসের জন্য ৫৫৫৫ এবং দ্বিতীয়টির জন্য ৫৫৫৬। আপনি হোস্টকে বিভিন্ন গেস্টের কাছে সেই পোর্টগুলি ফরওয়ার্ড করার জন্যও কনফিগার করতে পারেন:
# Connect to the first device
adb connect <device_1_ip_address>:5555
# Connect to a second device
adb connect <device_2_ip_address>:5555
# Connect to a second VM on first device on different port
adb connect <device_1_ip_address>:5556
# List all connected devices to verify
adb devices
পরবর্তী adb কমান্ডগুলো চালানোর সময়, আপনি -s ফ্ল্যাগ এবং সম্পূর্ণ অ্যাড্রেস ( ip:port ) ব্যবহার করে একটি নির্দিষ্ট ডিভাইসকে টার্গেট করতে পারেন:
# Run a shell command on the second VM on first device in the above example
adb -s <device_1_ip_address>:5556 shell
লগ দেখুন
যখন কোনো পরিষেবা ব্যর্থ হয় বা অপ্রত্যাশিত আচরণ করে, তখন প্রথমে লগগুলো পরীক্ষা করুন।
লগক্যাট (অ্যান্ড্রয়েড লগ) ব্যবহার করুন
logcat সিস্টেম সার্ভিস, এজেন্ট এবং সার্ভিস বান্ডেল থেকে লগ প্রদর্শন করে:
# View all logs in real-time
adb logcat
# Filter logs by a specific tag (e.g., the name of your service)
adb logcat -s MyServiceTag
# Filter logs by priority (V: Verbose, D: Debug, I: Info, W: Warn, E: Error, F: Fatal)
# This shows only Error and Fatal messages for a specific tag
adb logcat MyServiceTag:E *:S
# Clear old logs before viewing new ones
adb logcat -c && adb logcat
# Show all logs and return
adb logcat -d
# Color logs by level
adb logcat -v color
# Show timestamps as time since boot
adb logcat -v monotonic
dmesg (কার্নেল লগ) ব্যবহার করুন
dmesg লিনাক্স কার্নেলের লগ প্রদর্শন করে। নিম্নলিখিত বিষয়গুলো ডিবাগ করার জন্য এটি অত্যন্ত গুরুত্বপূর্ণ:
- হার্ডওয়্যার এবং ড্রাইভার সমস্যা
- কার্নেল প্যানিক
- SELinux প্রত্যাখ্যান (
avc: denied) - যা logcat-এও প্রদর্শিত হয়
# View all kernel messages
adb shell dmesg
# Follow kernel messages in real-time
adb shell dmesg -w
কাটলফিশে অ্যাক্সেস লগ
যখন আপনি একটি কাটলফিশ ভার্চুয়াল ডিভাইসে এটি চালান, তখন আপনি হোস্ট মেশিনের ফাইল সিস্টেম থেকে সরাসরি লগ ফাইলগুলো অ্যাক্সেস করতে পারেন। এটি বিশেষত তখন কাজে আসে যখন adb উপলব্ধ থাকে না। আপনি যখন কাটলফিশ চালু করেন, তখন এটি সমস্ত ডিবাগিং পাথ আউটপুট করে, এবং আপনি চলমান সমস্ত ইনস্ট্যান্সের জন্য cvd fleet ব্যবহার করে সেগুলো খুঁজেও দেখতে পারেন।
- লগক্যাট (অ্যান্ড্রয়েড লগ):
cuttlefish/instances/cvd-1/logs/logcat - কার্নেল লগ:
cuttlefish/instances/cvd-1/logs/kernel.log - কাটলফিশ লঞ্চার লগ:
cuttlefish/instances/cvd-1/logs/launcher.log(কাটলফিশ পরিবেশ ডিবাগ করার জন্য উপযোগী)
আপনি cat , less , বা tail -f এর মতো সাধারণ কমান্ড-লাইন টুল ব্যবহার করে রিয়েল টাইমে এই ফাইলগুলো দেখতে পারেন।
শেল এবং ফাইল সিস্টেমের সাথে ইন্টারঅ্যাক্ট করুন
ডিভাইসে সরাসরি কমান্ড চালানোর জন্য, প্রসেসের অবস্থা পরীক্ষা করার জন্য এবং ফাইল সিস্টেমে নেভিগেট করার জন্য শেল অ্যাক্সেস লাভ করুন:
# Open an interactive shell on the device
adb shell
# From within the shell, you can check running processes
ps -A
# Or check the status of a specific service managed by init
getprop init.svc.<service_name>
ফাইল সিস্টেম অপারেশন সম্পাদন করুন
আপনার হোস্ট মেশিন এবং ডিভাইসের মধ্যে ফাইল স্থানান্তর করতে adb push এবং adb pull ব্যবহার করুন। টেস্ট স্ক্রিপ্ট ডেপ্লয় করতে, কনফিগারেশন আপডেট করতে, বা ক্র্যাশ ডাম্প পুনরুদ্ধার করতে এটি ব্যবহার করুন:
# Push a file from your computer to the device
adb push my_local_file.txt /data/local/tmp/
# Pull a file from the device to your computer
adb pull /data/tombstones/tombstone_00 .
অ্যাপ্লিকেশন ডিবাগ করুন (C++/Rust)
আপনি অ্যাপ্লিকেশনগুলো অনলাইন বা অফলাইনে ডিবাগ করতে পারেন।
লাইভ ডিবাগিংয়ের জন্য lldb ব্যবহার করুন
lldb হলো অ্যান্ড্রয়েড স্টুডিওর ডিফল্ট ডিবাগার এবং আধুনিক C++ ও Rust ডেভেলপমেন্টের জন্য এটি প্রায়শই বেশি পছন্দ করা হয়।
এই সেটআপ ধাপগুলো অনুসরণ করুন:
রুট পারমিশন দেওয়ার জন্য adb রিস্টার্ট করুন (ফরওয়ার্ড করার জন্য এটি আবশ্যক)। পোর্ট ফরওয়ার্ডিং সেট আপ করতে এটি ব্যবহার করুন। হোস্টে, চালান:
adb rootযদি কোনো বাইনারিতে ডিবাগিং সিম্বল থাকে, তাহলে একটি আনস্ট্রিপড ভার্সন পুশ করুন। আপনি আনস্ট্রিপড ভার্সনটি
out/target/product/[SDV_FLAVOR]/symbols/[PARTITION]/bin/[EXECUTABLE]খুঁজে পাবেন। উদাহরণস্বরূপ,system_extএবংsdv_core_cfথেকেrpcagentআপলোড করতে, চালান:adb push out/target/product/sdv_core_cf/symbols/system_ext/bin/rpcagent /data/local/tmpএখন অপরিবর্তিত সংস্করণটি
/data/local/tmpএ রয়েছে।lldbclient.pyসুবিধাজনক স্ক্রিপ্টটি ব্যবহার করে LLDB ক্লায়েন্টের সাথে সংযোগ করুন:# Run and connect a binary on device, run on host: lldbclient.py -r /data/local/tmp/rpcagent # Connect to an existing process with PID 2759 lldbclient.py -p 2759এই স্ক্রিপ্টটি দূরবর্তীভাবে lldb-এর সাথে সংযোগ স্থাপন করে। সমস্ত উপলব্ধ ফ্ল্যাগের জন্য,
lldbclient.pyচালান। lldb-এর সাথে সংযোগ করার জন্য আপনার IDE ডকুমেন্টেশন দেখুন।
ক্র্যাশ ডাম্প (টুম্বস্টোন) বিশ্লেষণ করুন
যখন কোনো সার্ভিস ক্র্যাশ করে, তখন /data/tombstones/ একটি টুম্বস্টোন ফাইল তৈরি হয়। এই ফাইলে স্ট্যাক ট্রেস, মেমরি ম্যাপ এবং অন্যান্য গুরুত্বপূর্ণ তথ্য থাকে।
টুম্বস্টোন ফাইলটি সংগ্রহ করুন, তারপর বাইনারিটির অপরিবর্তিত সংস্করণ দিয়ে এটি বিশ্লেষণ করার জন্য একটি সিম্বল-সচেতন টুল (যেমন lldb বা কোনো বিশেষ স্ক্রিপ্ট) ব্যবহার করুন।
কর্মক্ষমতা বিশ্লেষণ করুন
এসডিভি কর্মক্ষমতা পরিমাপের জন্য একাধিক টুল সমর্থন করে।
সিপিইউ এবং মেমরি ব্যবহার পরীক্ষা করুন
top: সিপিইউ ব্যবহারের ভিত্তিতে সাজানো চলমান প্রসেসগুলোর রিয়েল-টাইম চিত্র প্রদান করে।adb shell top -m 10 # Show top 10 processesprocrank: কোনো নির্দিষ্ট প্রসেস বা সম্পূর্ণ সিস্টেমের মেমরি ব্যবহারের বিস্তারিত বিবরণ প্রদান করে।adb shell procrank
পরিষেবার অবস্থা জানতে dumpsys ব্যবহার করুন
যেকোনো অ্যান্ড্রয়েড সিস্টেম সার্ভিসের অভ্যন্তরীণ অবস্থা জানার জন্য dumpsys একটি শক্তিশালী টুল।
# List all available services
adb shell dumpsys -l
# Dump the state of a specific service or agent
adb shell dumpsys <service_name>
পারফরম্যান্স বিশ্লেষণের জন্য টর্ক ব্যবহার করুন
torq হলো একটি কমান্ড-লাইন টুল যা অ্যান্ড্রয়েডে প্রোফাইলিং এবং ট্রেসিংয়ের কাজগুলোকে সহজ করে। এটি সিস্টেম পারফরম্যান্স বিশ্লেষণের সময় Simpleperf, Perfetto এবং অন্যান্য সাধারণ টাস্কগুলো চালানোর সুযোগ দেয়।
ট্রেসিং করার জন্য পারফেট্টো ব্যবহার করুন
অ্যান্ড্রয়েডে সিস্টেম-ব্যাপী ট্রেসিংয়ের জন্য পারফেটটো একটি আদর্শ টুল। পারফেটটো আপনাকে সিস্টেম ইভেন্ট, অ্যাপ-স্তরের ট্রেস পয়েন্ট এবং পারফরম্যান্স কাউন্টার রেকর্ড করতে ও সেগুলোকে একটি টাইমলাইনে প্রদর্শন করতে দেয়।
মূল পদক্ষেপ:
- আপনার C++ বা Rust কোডে ট্রেস পয়েন্ট যোগ করুন:
- C++:
TRACE_EVENTম্যাক্রোর সাথে Perfetto SDK ব্যবহার করুন। - রাস্ট:
tracingক্রেটটি ব্যবহার করুন, যা পারফেটোর সাথে সামঞ্জস্যপূর্ণ ATrace ইভেন্ট নির্গত করে।
- C++:
- ডেটা উৎস (যেমন,
ftrace,track_event), ক্যাটাগরি এবং ট্যাগ নির্দিষ্ট করার জন্য একটি টেক্সটপ্রোটো কনফিগারেশন ফাইল তৈরি করুন। - ডিভাইস থেকে ট্রেস ক্যাপচার করতে আপনার কনফিগারেশন ফাইলের সাথে
record_android_traceস্ক্রিপ্টটি (external/perfetto/tools/record_android_trace) ব্যবহার করুন। - সিস্টেমের আচরণ বিশ্লেষণ করতে, প্রতিবন্ধকতা শনাক্ত করতে এবং পরিষেবাগুলোর পারস্পরিক সম্পর্ক বুঝতে পারফেটটো ওয়েব UI- তে তৈরি হওয়া ট্রেস ফাইলটি খুলুন।
ইন্সট্রুমেন্টেশন, কনফিগারেশন এবং ডেটা সংগ্রহের বিস্তারিত নির্দেশাবলীর জন্য, "সিস্টেমের পারফরম্যান্স সম্পর্কে ধারণা পেতে ট্রেসিং ব্যবহার করুন" দেখুন।
প্রোফাইলিংয়ের জন্য সিম্পলপার্ফ ব্যবহার করুন
Simpleperf হলো অ্যান্ড্রয়েডের পারফরম্যান্স প্রোফাইলিংয়ের জন্য একটি বহুমুখী কমান্ড-লাইন টুল, যা লিনাক্স perf-এর অনুরূপ।
সাধারণ ব্যবহারের ক্ষেত্রসমূহ:
- সিপিইউ প্রোফাইলিং: সবচেয়ে বেশি সিপিইউ সময় ব্যবহারকারী ফাংশনগুলো শনাক্ত করুন।
- অফ-সিপিইউ বিশ্লেষণ: থ্রেডগুলো কেন স্লিপিং বা ব্লকড হচ্ছে তা বিশ্লেষণ করুন।
- হার্ডওয়্যার কাউন্টার: হার্ডওয়্যার পারফরম্যান্স কাউন্টারগুলো অ্যাক্সেস করুন।
উদাহরণস্বরূপ কমান্ডসমূহ:
# Go to simpleperf scripts
cd system/extras/simpleperf/scripts
# Profile system for 20 seconds and record call graph
./app_profiler.py --system_wide -r "--call-graph fp --duration 20"
# Record a profile for a specific process (PID 1)
./app_profiler.py --pid 1 -r "--call-graph fp --duration 5"
# Pull the profile data
adb pull /data/local/tmp/perf.data .
# Generate a report with symbol resolution
./report_html.py --add_source_code --source_dirs $ANDROID_BUILD_TOP --add_disassembly -o report.html
সিম্পলপার্ফ আরও অনেক ইভেন্ট এবং অপশন প্রদান করে। বিস্তারিত তথ্যের জন্য সিম্পলপার্ফ গাইড দেখুন।
SELinux প্রত্যাখ্যান
লক্ষণ : আপনার সার্ভিসটি চালু হতে, কোনো ফাইল অ্যাক্সেস করতে বা কোনো ক্যাপাবিলিটি ব্যবহার করতে ব্যর্থ হয় এবং আপনি dmesg বা logcat এ একটি avc: denied মেসেজ দেখতে পান।
[ 123.456] avc: denied { read } for pid=789 comm="my_service" name="some_file" dev="sda1" ino=123 scontext=u:r:my_service_t:s0 tcontext=u:object_r:some_file_t:s0 tclass=file permissive=0
দ্রুত ডিবাগ (শুধুমাত্র উন্নয়নের জন্য)
সমস্যাটির সমাধান হয় কিনা তা দেখতে আপনি সাময়িকভাবে SELinux এনফোর্সমেন্ট নিষ্ক্রিয় করতে পারেন। এটি নিশ্চিত করে যে সমস্যাটি একটি অনুপস্থিত SELinux পলিসি রুলের কারণে হচ্ছে।
# Disabling SELinux requires root permission
adb root
# Set SELinux to permissive mode
adb shell setenforce 0
# Check the current mode (should return "Permissive")
adb shell getenforce
সমাধান : ডিনায়াল মেসেজটির ক্ষেত্রে অ্যান্ড্রয়েড সোর্স ট্রি থেকে audit2allow টুলটি ব্যবহার করুন। এটি আপনার ডিভাইসের SELinux কনফিগারেশনে যোগ করার জন্য সঠিক .te পলিসি রুল তৈরি করে।