不能用gdb调试的场景下,如果发生崩溃,用 add2line工具也能定位到崩溃的行号。

  1. 首先在代码中添加以下代码 int pid = getpid(); printf("bitrate_control_init pid: %d\n",pid); char cmd[128]={0}; snprintf(cmd,128,"cat /proc/%d/maps",pid); system(cmd); 这样代码运行后,能将当前进程的各动态库加载地址的打印出来。当进程发生崩溃时,这各动态库的起始地址将会用到。 其打印举例如下: 775bd000-775be000 rw-p 0006d000 00:01 197 /lib/libuClibc-0.9.33.2.so 775be000-775c4000 rw-p 00000000 00:00 0 775c4000-775ff000 r-xp 00000000 00:01 520 /usr/lib/liblds-media.so 775ff000-7760e000 ---p 00000000 00:00 0 7760e000-77665000 rw-p 0003a000 00:01 520 /usr/lib/liblds-media.so 77665000-7766a000 rw-p 00000000 00:00 0 7766a000-7766e000 r-xp 00000000 00:01 515 /usr/lib/liblds-common.so
  2. 发生崩溃后,查找epc信息 demsg查看崩溃信息,比如 [ 3.203457] ispcore: irq-status 0x00000600, err is 0x200,0x3f8,084c is 0x0 [ 3.307395] do_page_fault() #2: sending SIGSEGV to doorbell for invalid read access from [ 3.307395] 00000014 (epc == 775d9aac, ra == 775d9ab4) [ 3.445063] Write:{0x 100,0x 0} [ 3.445082] sc5239 stream off

3.用addr2line去定位 比如: 定位 liblds-media.so 崩溃.前提 so用-g 编译 dmesg 查看 [ 8853.990720] do_page_fault(): sending SIGSEGV to test_video_capt for invalid write access to 00000000 [ 8854.006194] epc = 778608d0 in liblds-media.so[77848000+22000] [ 8854.028971] ra = 778608c8 in liblds-media.so[77848000+22000] [ 8854.051571]

epc在liblds-media.so中的相对地址为:778608d0-77848000= 0x188d0

mips-linux-gnu-addr2line 0x188d0 -e liblds-media.so -f -C -s t40_encoder_init t40_video_capture.c:855