黑屏或特殊情形下查看对应进程的栈和调用情况

本文介绍了在遇到设备黑屏问题时如何使用ADB进行故障排查。针对ADB可用与不可用两种情况,提供了详细的分析流程和方法,包括如何获取ramdump、adb日志及进程堆栈信息。

在黑屏问题分析时,可以分2个类别:

1、adb可用

2、adb不可用

在adb不可用时,我们需要短接reset pin让设备进入download mode,而后抓取完整的ram dump来进行后续分析。

在adb可用时,我们则可以先抓取adb日志,而后根据日志分析结果来查问题或看值得怀疑的进程堆栈。

adb下查堆栈有两个方法:cat /proc/process-ID/stack,debuggerd -b process-ID


下面列下利用debuggerd情况,他会列出该进程下所有线程的堆栈,我们可以查黑屏时例如resume、suspend或者backlight这些进程的主线程是否处于hang状态。


root@msm8226:/ # debuggerd -b 3513
debuggerd -b 3513
Sending request to dump task 3513.




----- pid 3513 at 2014-01-12 02:46:36 -----
Cmd line: android.process.media


"d.process.media" sysTid=3513
  #00  pc 00021888  /system/lib/libc.so (epoll_wait+12)
  #01  pc 0001063f  /system/lib/libutils.so (android::Looper::pollInner(int)+98)
  #02  pc 00010869  /system/lib/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+92)
  #03  pc 0006a6f9  /system/lib/libandroid_runtime.so (android::NativeMessageQueue::pollOnce(_JNIEnv*, int)+22)
  #04  pc 0002034c  /system/lib/libdvm.so (dvmPlatformInvoke+112)
  #05  pc 00050fcf  /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398)
  #06  pc 0003b67d  /system/lib/libdvm.so (dvmCheckCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+8)
  #07  pc 000297e0  /system/lib/libdvm.so
  #08  pc 00030c6c  /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
  #09  pc 0002e304  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
  #10  pc 00063719  /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+392)
  #11  pc 0006b61f  /system/lib/libdvm.so
  #12  pc 000297e0  /system/lib/libdvm.so
  #13  pc 00030c6c  /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
  #14  pc 0002e304  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
  #15  pc 00063435  /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+336)
  #16  pc 0004cbb7  /system/lib/libdvm.so
  #17  pc 0003fc45  /system/lib/libdvm.so
  #18  pc 0004d3bf  /system/lib/libandroid_runtime.so
  #19  pc 0004e0e3  /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+354)
  #20  pc 0000105b  /system/bin/app_process
  #21  pc 0000e49b  /system/lib/libc.so (__libc_init+50)
  #22  pc 00000d7c  /system/bin/app_process
  
...................中间省略多个堆栈详情


"Binder_6" sysTid=12985
  #00  pc 000206d4  /system/lib/libc.so (__ioctl+8)
  #01  pc 0002cf3b  /system/lib/libc.so (ioctl+14)
  #02  pc 0001d3ed  /system/lib/libbinder.so (android::IPCThreadState::talkWithDriver(bool)+140)
  #03  pc 0001daf7  /system/lib/libbinder.so (android::IPCThreadState::getAndExecuteCommand()+6)
  #04  pc 0001db8d  /system/lib/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+48)
  #05  pc 000219a5  /system/lib/libbinder.so
  #06  pc 0000ea5d  /system/lib/libutils.so (android::Thread::_threadLoop(void*)+216)
  #07  pc 0004d359  /system/lib/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+68)
  #08  pc 0000e58f  /system/lib/libutils.so
  #09  pc 0000d220  /system/lib/libc.so (__thread_entry+72)
  #10  pc 0000d3b8  /system/lib/libc.so (pthread_create+240)


----- end 3513 -----

### MIPI 接口黑屏时图层输出及显示信息调试方法 在排查显示问题时,可以通过检查 MIPI 接口的图层输出相关显示信息来定位问题。以下内容详细描述了在黑屏情况下如何查看图层输出以及进行显示信息调试的方法。 #### 查看图层输出 在嵌入式系统中,MIPI 接口的图层输出通常可以通过帧缓冲区(Frame Buffer)图形子系统访问。以下是一些常用方法: - **通过帧缓冲区查看图层数据**:帧缓冲区设备通常位于 `/dev/fb0` 其他类似路径下。可以使用以下命令读取帧缓冲区的内容并保存为图像文件以检查是否存在输出[^1]。 ```bash dd if=/dev/fb0 of=framebuffer.raw bs=$(cat /sys/class/graphics/fb0/stride) count=$(cat /sys/class/graphics/fb0/virtual_height) ``` 上述命令将帧缓冲区的数据保存为 `framebuffer.raw` 文件,随后可以使用图像处理工具将其转换为可查看的格式。 - **通过调试接口获取图层信息**:某些系统提供专门的调试接口以查看图层状态。例如,在 Android 系统中,可以通过以下命令启用调试模式并捕获图层信息[^2]。 ```bash adb shell setprop debug.sf.show_layers 1 adb shell dumpsys SurfaceFlinger ``` #### 显示信息调试 为了进一步排查显示问题,可以利用以下方法获取 MIPI 接口的显示信息: - **通过设备树文件检查配置**:MIPI 接口的配置通常定义在设备树文件中。进入内核根目录后,执行以下命令以加载配置界面并检查 MIPI 相关参数[^3]。 ```bash make ARCH=arm menuconfig ``` 在配置界面中,导航至 `Device Drivers -> Graphics support -> MIPI DSI support`,确保相关选项已启用。 - **通过内核调试接口获取状态**:某些系统提供内核调试接口以实时监控 MIPI 接口的状态。例如,可以通过以下路径查看 MIPI DSI 的运行状态[^4]。 ```bash cat /sys/kernel/debug/mipi_dsi/panel_info ``` - **模拟静电测试以验证恢复能力**:可以通过写入特定值模拟静电干扰,观察屏幕是否能够自动恢复。例如,执行以下命令模拟静电黑屏并验证恢复情况[^5]。 ```bash adb shell "echo 1000 > /sys/lcd_sys/reg_debug/dwrite" ``` #### 示例代码:捕获帧缓冲区数据 以下是一个示例代码,用于捕获帧缓冲区数据并将其转换为 PNG 图像: ```python import struct from PIL import Image # 读取帧缓冲区数据 with open('/dev/fb0', 'rb') as fb: data = fb.read() # 获取分辨率像素格式 with open('/sys/class/graphics/fb0/virtual_width', 'r') as f: width = int(f.read()) with open('/sys/class/graphics/fb0/virtual_height', 'r') as f: height = int(f.read()) # 假设像素格式为 RGB565 image = Image.frombytes('RGB', (width, height), data, 'raw', 'BGR;16') image.save('framebuffer.png') ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值