【NDK系列】Android tombstone文件分析

文件位置

data/tombstone/tombstone_xx.txt

獲取tombstone文件命令:

  1. adb shell cp /data/tombstones ./tombstones

觸發時機

NDK程序在發生崩潰時,它會在路徑/data/tombstones/下產生導致程序crash的文件tombstone_xx,記錄了死亡了進程的基本信息(例如進程的進程號,線程號),死亡的地址(在哪個地址上發生了Crash),死亡時的現場是什么樣的(記錄了一系列的堆棧調用信息)等等。

內容示例

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'Android-x86/android_x86/x86:5.1.1/LMY48W/woshijpf04211939:eng/test-keys'
Revision: '0'
ABI: 'x86'
pid: 1019, tid: 1019, name: surfaceflinger  >>> /system/bin/surfaceflinger <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4eax a6265c06  ebx b7467d88  ecx b7631a22  edx a6265c06esi 00000000  edi b6867140xcs 00000073  xds 0000007b  xes 0000007b  xfs 00000000  xss 0000007beip b745a639  ebp bfcfc1e8  esp bfcfc150  flags 00010282backtrace:#00 pc 00006639  /system/lib/libui.so (android::Fence::waitForever(char const*)+41)#01 pc 00034b86  /system/lib/libsurfaceflinger.so#02 pc 0003229e  /system/lib/libsurfaceflinger.so#03 pc 0002cb9c  /system/lib/libgui.so (android::BufferQueue::ProxyConsumerListener::onFrameAvailable(android::BufferItem const&)+652)#04 pc 000342f4  /system/lib/libgui.so (android::BufferQueueProducer::queueBuffer(int, android::IGraphicBufferProducer::QueueBufferInput const&, android::IGraphicBufferProducer::QueueBufferOutput*)+2580)#05 pc 0004eafb  /system/lib/libgui.so (android::Surface::queueBuffer(ANativeWindowBuffer*, int)+411)#06 pc 0004ce06  /system/lib/libgui.so (android::Surface::hook_queueBuffer(ANativeWindow*, ANativeWindowBuffer*, int)+38)#07 pc 00014bc6  /system/lib/egl/libGLES_android.so#08 pc 00017f73  /system/lib/egl/libGLES_android.so (eglSwapBuffers+163)#09 pc 00015fdb  /system/lib/libEGL.so (eglSwapBuffers+203)#10 pc 000013ea  /system/lib/hw/hwcomposer.x86.so#11 pc 00034730  /system/lib/libsurfaceflinger.so#12 pc 000256d4  /system/lib/libsurfaceflinger.so#13 pc 00024bf4  /system/lib/libsurfaceflinger.so#14 pc 000236fb  /system/lib/libsurfaceflinger.so#15 pc 0002338a  /system/lib/libsurfaceflinger.so#16 pc 0001e0ff  /system/lib/libsurfaceflinger.so#17 pc 0001d9ce  /system/lib/libutils.so (android::Looper::pollInner(int)+926)#18 pc 0001db73  /system/lib/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+67)#19 pc 0001e561  /system/lib/libsurfaceflinger.so#20 pc 00022ce7  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::run()+39)#21 pc 00000ca3  /system/bin/surfaceflinger#22 pc 0001365a  /system/lib/libc.so (__libc_init+106)#23 pc 00000da8  /system/bin/surfaceflingerstack:bfcfc110  00000000  bfcfc114  b6839270  bfcfc118  00000000  bfcfc11c  00000000  bfcfc120  b68394e0  bfcfc124  00000002  bfcfc128  00000002  bfcfc12c  b75d8185  /system/lib/libutils.so (android::RefBase::incStrong(void const*) const+53)bfcfc130  b6839270  bfcfc134  bfcfc1e8  [stack]bfcfc138  00000002  bfcfc13c  a6265c06  bfcfc140  b7467d88  /system/lib/libui.sobfcfc144  00000000  bfcfc148  b6867140  bfcfc14c  b745a639  /system/lib/libui.so (android::Fence::waitForever(char const*)+41)#00  bfcfc150  b683af18  bfcfc154  bfcfc1e8  [stack]bfcfc158  00000000  bfcfc15c  00000000  bfcfc160  00000000  bfcfc164  b683af18  bfcfc168  b75ec9c4  /system/lib/libutils.sobfcfc16c  b75d8285  /system/lib/libutils.so (android::RefBase::weakref_type::decWeak(void const*)+37)bfcfc170  00000000  bfcfc174  00000000  bfcfc178  00000000  bfcfc17c  00000000  bfcfc180  b7642968  /system/lib/libsurfaceflinger.sobfcfc184  bfcfc1e8  [stack]bfcfc188  b6867140  bfcfc18c  b7622b87  /system/lib/libsurfaceflinger.so

構建指紋

Build fingerprint: 'Android-x86/android_x86/x86:5.1.1/LMY48W/woshijpf04211939:eng/test-keys'

典型的格式為:AOSP/[Android Version]/[Build ID]/[Build Date]

  • “Android-x86”: 表示Android-x86工程
  • “android_x86”: 表示Android-x86工程的分支名或者構建變體
  • “x86:5.1.1”: 表示安卓版本為5.1.1, 即Lollipop。"x86"表示其針對x86架構CPU進行優化
  • “LMY48W”: 表示構建號(build number),構建號可以自定義,比如某個feature、bugfix的提交號
  • “woshijpf04211939:eng”: 自定義標簽,比如構建者、構建目等,“eng” 可能表示使用了engineering配置
  • “test-keys”: 表示此構建使用了測試key而不是正式發布的key文件

崩潰的過程和PID

pid: 1019, tid: 1019, name: surfaceflinger  >>> /system/bin/surfaceflinger <<<

如果pid等于tid,那么就說明這個程序是在主線程中Crash掉的,名稱的屬性則表示Crash進程的名稱以及在文件系統中位置。

終止信號和故障地址

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4

信息說明出現進程Crash的原因是因為程序產生了段錯誤的信號,訪問了非法的內存空間,而訪問的非法地址是0x4。

典型的內存地址訪問錯誤:

  1. 野指針
  2. 內存泄露
  3. 堆棧溢出
  4. 初始化錯誤
  5. 類型轉換錯誤
  6. 數字除0

Linux信號機制

崩潰信號列表

在這里插入圖片描述
信號機制是Linux進程間通信的一種重要方式,Linux信號一方面用于正常的進程間通信和同步,如任務控制(SIGINT,SIGTSTP,SIGKILL,SIGCONT,…);另一方面,它還負責監控系統異常及中斷。當應用程序運行異常時,Linux內核將產生錯誤信號并通知當前進程。當前進程在接收到該錯誤信號后,可以有三種不同的處理方式:

  1. 忽略該信號。
  2. 捕捉該信號并執行對應的信號處理函數(信號處理程序)。
  3. 執行該信號的缺省操作(如SIGSEGV,其缺省操作是終止進程)。

當Linux應用程序在執行時發生嚴重錯誤,一般會導致程序崩潰。其中,Linux專門提供了一類crash信號,在程序接收到此類信號時,缺省操作是將崩潰的現場信息記錄到核心文件,然后終止進程。

CPU寄存器

調用堆棧

backtrace:#00 pc 00006639  /system/lib/libui.so (android::Fence::waitForever(char const*)+41)#01 pc 00034b86  /system/lib/libsurfaceflinger.so#02 pc 0003229e  /system/lib/libsurfaceflinger.so#03 pc 0002cb9c  /system/lib/libgui.so (android::BufferQueue::ProxyConsumerListener::onFrameAvailable(android::BufferItem const&)+652)#04 pc 000342f4  /system/lib/libgui.so (android::BufferQueueProducer::queueBuffer(int, android::IGraphicBufferProducer::QueueBufferInput const&, android::IGraphicBufferProducer::QueueBufferOutput*)+2580)
  • #00,#01,#02表示函數調用棧中棧幀的編號,編號越小的棧幀表示著當前最近調用的函數信息,所以棧幀標號#00表示的就是當前正在執行并導致程序崩潰函數的信息。
  • pc后面的16進制數值表示的是當前函數正在執行的語句在共享鏈接庫或者可執行文件中的位置
  • /system/lib/libui.so表示的是當前執行指令是在哪個文件當中
  • 小括號則是注明對應的是哪個函數
    例如,在上面的例子中,我們就可以定位到是程序是在Fence :: waitForever(char const *)中出現了錯誤,但是具體在那一行呢,我們還不是特別清楚,所以就需要我們進一步地使用更加高級的工具來幫助我們解析tombstone中有關調用棧的信息。

堆疊每個通話的內容

處理工具

Google在NDK包中為我們提供了一系列的調試工具:

  • addr2line
  • objdump
  • ndk-stack

在介紹上述工具的使用方法之前有必要再次介紹一下so文件的構成,雖然這部分內容屬于NDK范疇。

so文件介紹

so文件組成

完整的 .so 文件由 C/C++代碼和一些 debug 信息組成,這些 debug 信息會記錄 .so中所有方法的對照表,就是方法名和其偏移地址的對應表,也叫做符號表symbolic 信息,這種.so被稱為未strip的,通常體積會比較大。

注意:

  1. 符號表可以類比為 Java 代碼混淆中的 mapping 文件,只有擁有這個 mapping 文件才能進行堆棧分析。
  2. 編譯完so文件后,需要保留「機器碼+debug信息的完整so文件」或者「僅含debug信息的符號表文件」

在這里插入圖片描述

可以通過file命令查看so文件基本信息,以判斷是否包含debug信息:

# 查看已被stripped的so文件
file libbreakpad-core-s.so
libbreakpad-core-s.so: *******, BuildID[sha1]=54ad86d708f4dc0926ad220b098d2a9e71da235a, stripped
# 查看未被stripped的so文件
file libbreakpad-core.so
libbreakpad-core.so: ******, BuildID[sha1]=54ad86d708f4dc0926ad220b098d2a9e71da235a, with debug_info, not stripped

so文件獲取

目前 Android Studio 無論是使用 mk 或者 Cmake 編譯的方式都會同時輸出 strip 和未 strip 的 so:

  • strip 之前的 so 路徑:{project}/app/build/intermediates/merged_native_libs
  • strip 之后的 so 路徑:{project}/app/build/intermediates/stripped_native_libs

如下圖是 Cmake 編譯 so 產生的兩個對應的 so:

圖片 1 圖片 2

addr2line

該工具通過輸入so文件和backtrace中的地址來輸出源碼中的行號,支持一次性輸入多個地址。

工具路徑:

  • Mac OS:$NDK_ROOT/toolchains/x86-4.9/prebuilt/darwin-x86_64/bin/i686-linux-android-addr2line

最佳實踐:

alias addr2line='$NDK_HOME/toolchains/x86-4.6/prebuilt/linux-x86/bin/i686-linux-android-addr2line'

注意:

  1. so文件需要帶符號表,位于out/target/product/cc_company/symbols/system/lib
  2. 由于是逐行解析,因此想要得到完整的源碼調用棧需要自行封裝寫個腳本工具;

用法

Usage:android-addr2line [option(s)] [addr(s)]Convert addresses into line number/file name pairs.If no addresses are specified on the command line, they will be read from stdinThe options are:@<file>                Read options from <file>-a --addresses         Show addresses-b --target=<bfdname>  Set the binary file format-e --exe=<executable>  Set the input file name (default is a.out)-i --inlines           Unwind inlined functions-j --section=<name>    Read section-relative offsets instead of addresses-p --pretty-print      Make the output easier to read for humans-s --basenames         Strip directory names-f --functions         Show function names-C --demangle[=style]  Demangle function names-h --help              Display this information-v --version           Display the program's versionandroid-addr2line: supported targets: elf32-i386 elf32-iamcu a.out-i386-linux pei-i386 elf64-x86-64 elf32-x86-64 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big plugin srec symbolsrec verilog tekhex binary ihex
Report bugs to <http://www.sourceware.org/bugzilla/>

推薦:add2line -fCp -e /path/to/xxx.so \<addresses\>

示例

執行命令:
addr2line -f -e libui.so 00006639

輸出結果:

_ZN7android5Fence11waitForeverEPKc
/home/woshijpf/newspace/android-x86/frameworks/native/libs/ui/Fence.cpp:59

ndk-stack

可將墓碑文件中的backtrace和stack完整還原成源碼文件路徑+代碼行號的呈現方式。

工具路徑:$NDK_HOME/ndk-stack

注意:

  1. 需要obj目錄,例如obj/local/x86/
  2. 通常用于本地調試階段的問題排查,對于線上問題排查時不一定保留這些符號表文件

用法

Usage:ndk-stack -sym <path> [-dump <path>]-sym  Contains full path to the root directory for symbols.-dump Contains full path to the file containing the crash dump.This is an optional parameter. If ommited, ndk-stack willread input data from stdin
  • sym: 需要輸入符號表文件的根目錄,即obj目錄
  • dump:輸入指定的trace文本文件路徑或者若缺省則從標準輸入讀取

示例

原墓碑文件內容:

// tombstone_01 文件內容
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'Android-x86/android_x86/x86:5.1.1/LMY48W/woshijpf04211939:eng/test-keys'
Revision: '0'
ABI: 'x86'
pid: 2125, tid: 2125, name: androidvncserve  >>> androidvncserver <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0eax 00000000  ebx b76ffff4  ecx b6a37000  edx 00000000esi 00000000  edi 00000000xcs 00000073  xds 0000007b  xes 0000007b  xfs 00000000  xss 0000007beip b75a4ec5  ebp bfa9bd08  esp bfa9bbf0  flags 00010246backtrace:#00 pc 0004bec5  /system/bin/androidvncserver#01 pc 0004e3e4  /system/bin/androidvncserver#02 pc 0001365a  /system/lib/libc.so (__libc_init+106)#03 pc 0001060c  /system/bin/androidvncserverstack:bfa9bbb0  bfa9bbc8  [stack]bfa9bbb4  b72c6fb0  /system/lib/libdvnc_flinger_sdk22.sobfa9bbb8  b72c7004  /system/lib/libdvnc_flinger_sdk22.sobfa9bbbc  b72c5b26  /system/lib/libdvnc_flinger_sdk22.so (readfb_flinger+38)bfa9bbc0  b68ae080  bfa9bbc4  00000000  bfa9bbc8  00000000  bfa9bbcc  00000000  bfa9bbd0  00000000  bfa9bbd4  b76ffff4  /system/bin/androidvncserverbfa9bbd8  b76a5e20  /system/bin/androidvncserverbfa9bbdc  b75ac181  /system/bin/androidvncserverbfa9bbe0  b75ac16b  /system/bin/androidvncserverbfa9bbe4  b76ffff4  /system/bin/androidvncserverbfa9bbe8  bfa9bd08  [stack]bfa9bbec  b75a579b  /system/bin/androidvncserver#00  bfa9bbf0  00000012  bfa9bbf4  bfa9bc1c  [stack]bfa9bbf8  00000000  bfa9bbfc  00000000  bfa9bc00  bfa9bc14  [stack]bfa9bc04  00000000  bfa9bc08  00000000  bfa9bc0c  b7498825  /system/lib/libc.so (je_free+453)bfa9bc10  0000000e  bfa9bc14  00000400  bfa9bc18  00000000  bfa9bc1c  b749538a  /system/lib/libc.so (je_malloc+778)bfa9bc20  0000000c  bfa9bc24  00000065  bfa9bc28  00000000  bfa9bc2c  b6a37000  ........  ........#01  bfa9bd10  b6bb7300  bfa9bd14  00001b58  bfa9bd18  b76aa954  /system/bin/androidvncserverbfa9bd1c  0000000b  bfa9bd20  00000005  bfa9bd24  00000000  bfa9bd28  00000000  bfa9bd2c  00000005  bfa9bd30  00000006  bfa9bd34  00000005  bfa9bd38  00000000  bfa9bd3c  00000000  bfa9bd40  00000000  bfa9bd44  bfa9bd24  [stack]bfa9bd48  b754f9c8  /system/bin/linkerbfa9bd4c  b7557bd8  /system/bin/linker........  ........#02  bfa9bed0  00000001  bfa9bed4  bfa9bf14  [stack]bfa9bed8  bfa9bf1c  [stack]bfa9bedc  00000000  bfa9bee0  b7556fec  /system/bin/linkerbfa9bee4  bfa9bf10  [stack]bfa9bee8  00000000  bfa9beec  b7556fec  /system/bin/linkerbfa9bef0  bfa9bf10  [stack]bfa9bef4  00000000  bfa9bef8  bfa9bf0c  [stack]bfa9befc  b756960d  /system/bin/androidvncserver#03  bfa9bf00  bfa9bf10  [stack]bfa9bf04  00000000  bfa9bf08  b756960d  /system/bin/androidvncserverbfa9bf0c  b7569612  /system/bin/androidvncserverbfa9bf10  00000001  bfa9bf14  bfa9cb05  [stack]bfa9bf18  00000000  bfa9bf1c  bfa9cb16  [stack]bfa9bf20  bfa9cb35  [stack]bfa9bf24  bfa9cb48  [stack]bfa9bf28  bfa9cba3  [stack]bfa9bf2c  bfa9cbae  [stack]bfa9bf30  bfa9cbc1  [stack]bfa9bf34  bfa9cbdc  [stack]bfa9bf38  bfa9cbe7  [stack]bfa9bf3c  bfa9cbfd  [stack]

執行命令:
ndk-stack -sym obj/local/x86/ -dump ~/android-x86-debug-log/tombstone_01

輸出結果:

********** Crash dump: **********
Build fingerprint: 'Android-x86/android_x86/x86:5.1.1/LMY48W/woshijpf04211939:eng/test-keys'
pid: 2125, tid: 2125, name: androidvncserve  >>> androidvncserver <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
Stack frame #00 pc 0004bec5  /system/bin/androidvncserver: Routine update_screen_16 in /home/woshijpf/android_workspace/droidVNCserver-real/jni/vnc/updateScreen.c:68
Stack frame #01 pc 0004e3e4  /system/bin/androidvncserver: Routine main in /home/woshijpf/android_workspace/droidVNCserver-real/jni/vnc/droidvncserver.c:805
Stack frame #02 pc 0001365a  /system/lib/libc.so (__libc_init+106)
Stack frame #03 pc 0001060c  /system/bin/androidvncserver: Unable to locate routine information for address 1060c in module obj/local/x86//androidvncserver
Stack frame #00 pc 0007bf71  /system/lib/libc.so (nanosleep+17)
Stack frame #01 pc 00047ed6  /system/lib/libc.so (usleep+70)
Stack frame #02 pc 0004fa6b  /system/bin/androidvncserver: Routine camera_io in /home/woshijpf/android_workspace/droidVNCserver-real/jni/vnc/camera_io.c:557
Stack frame #03 pc 0004af6a  /system/bin/androidvncserver: Routine receive_camera in /home/woshijpf/android_workspace/droidVNCserver-real/jni/vnc/droidvncserver.c:273
Stack frame #04 pc 00022168  /system/lib/libc.so (__pthread_start(void*)+56)
Stack frame #05 pc 0001cc69  /system/lib/libc.so (__start_thread+25)
Stack frame #06 pc 000137c6  /system/lib/libc.so (__bionic_clone+70)
Stack frame #00 pc 0007cc33  /system/lib/libc.so (recvfrom+19)
Stack frame #01 pc 00050cdb  /system/bin/androidvncserver: Routine handle_connections in /home/woshijpf/android_workspace/droidVNCserver-real/jni/vnc/gui.c:105
Stack frame #02 pc 00022168  /system/lib/libc.so (__pthread_start(void*)+56)
Stack frame #03 pc 0001cc69  /system/lib/libc.so (__start_thread+25)
Stack frame #04 pc 000137c6  /system/lib/libc.so (__bionic_clone+70)

objdump

使用objdump命令對目標文件(obj)或可執行文件進行反匯編,它以一種可閱讀的格式讓你更多的了解二進制文件可能帶有的附加信息。

參考文章:objdump的使用

參考資料

  • 谷歌官方教程:調試 Android 平臺原生代碼
  • Android NDK墓碑/崩潰分析_android墓碑文件_Lixby的博客-CSDN博客
  • Android的墓碑 - 掘金
  • Android 平臺 Native Crash 問題分析與定位

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716820.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716820.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716820.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單細胞Seurat - 細胞聚類(3)

本系列持續更新Seurat單細胞分析教程&#xff0c;歡迎關注&#xff01; 維度確定 為了克服 scRNA-seq 數據的任何單個特征中廣泛的技術噪音&#xff0c;Seurat 根據 PCA 分數對細胞進行聚類&#xff0c;每個 PC 本質上代表一個“元特征”&#xff0c;它結合了相關特征集的信息。…

深入測探:用Python玩轉分支結構與循環操作——技巧、場景及面試寶典

在編程的世界里&#xff0c;分支結構和循環操作是構建算法邏輯的基礎磚石。它們如同編程的“鹽”&#xff0c;賦予代碼生命&#xff0c;讓靜態的數據跳躍起來。本文將帶你深入探索Python中的分支結構和循環操作&#xff0c;通過精心挑選的示例和練習題&#xff0c;不僅幫助你掌…

mysql5*-mysql8 區別

1.Mysql5.7-Mysql8.0 sysbench https://github.com/geekgogie/mysql57_vs_8-benchmark_scripts 1.讀、寫、刪除更新 速度 512 個線程以后才會出現如下的。 2.刪除速度 2.事務處理性能 3.CPU利用率 mysql8 利用率高。 4.排序 5.7 只能ASC&#xff0c;不能降序 數據越來越大

牢記于心單獨說出來的知識點(后續會加)

第一個 非十進制&#xff08;八進制&#xff0c;十六進制&#xff09;寫在文件中它本身就是補碼&#xff0c;計算機是不用進行內存轉換&#xff0c;它直接存入內存。&#xff08;因為十六進制本身是補碼&#xff0c;所以計算機里面我們看到的都是十六進制去存儲&#xff09; …

Qt 簡約美觀的加載動畫 文本風格 第八季

今天和大家分享一個文本風格的加載動畫, 有兩類,其中一個可以設置文本內容和文本顏色,演示了兩份. 共三個動畫, 效果如下: 一共三個文件,可以直接編譯 , 如果對您有所幫助的話 , 不要忘了點贊呢. //main.cpp #include "LoadingAnimWidget.h" #include <QApplic…

MySQL:開始深入其數據(一)DML

在上一章初識MySQL了解了如何定義數據庫和數據表&#xff08;DDL&#xff09;&#xff0c;接下來我們開始開始深入其數據,對其數據進行訪問&#xff08;DAL&#xff09;、查詢DQL&#xff08;&#xff09;和操作(DML)等。 通過DML語句操作管理數據庫數據 DML (數據操作語言) …

一文搞定 FastAPI 路徑參數

路徑參數定義 路徑操作裝飾器中對應的值就是路徑參數,比如: from fastapi import FastAPI app = FastAPI()@app.get("/hello/{name}") def say_hello(name: str):return {

突破編程_C++_STL教程( list 的基礎知識)

1 std::list 概述 std::list 是 C 標準庫中的一個雙向鏈表容器。它支持在容器的任何位置進行常數時間的插入和刪除操作&#xff0c;但不支持快速隨機訪問。與 std::vector 或 std::deque 這樣的連續存儲容器相比&#xff0c;std::list 在插入和刪除元素時不需要移動其他元素&a…

計算機網絡之傳輸層 + 應用層

.1 UDP與TCP IP中的檢驗和只檢驗IP數據報的首部, 但UDP的檢驗和檢驗 偽首部 首部 數據TCP的交互單位是數據塊, 但仍說TCP是面向字節流的, 因為TCP僅把應用層傳下來的數據看成無結構的字節流, 根據當時的網絡環境組裝成大小不一的報文段.10秒內有1秒用于發送端發送數據, 信道…

【Python】進階學習:pandas--groupby()用法詳解

&#x1f4ca;【Python】進階學習&#xff1a;pandas–groupby()用法詳解 &#x1f308; 個人主頁&#xff1a;高斯小哥 &#x1f525; 高質量專欄&#xff1a;Matplotlib之旅&#xff1a;零基礎精通數據可視化、Python基礎【高質量合集】、PyTorch零基礎入門教程&#x1f448;…

Python算法100例-3.5 親密數

1.問題描述2.問題分析3.算法設計4.確定程序框架5.完整的程序6.問題拓展 1&#xff0e;問題描述 如果整數A的全部因子&#xff08;包括1&#xff0c;不包括A本身&#xff09;之和等于B&#xff0c;且整數B的全部因子&#xff08;包括1&#xff0c;不包括B本身&#xff09;之和…

中國電子學會2020年6月份青少年軟件編程Sc ratch圖形化等級考試試卷四級真題。

第 1 題 【 單選題 】 1.執行下面程序&#xff0c;輸入4和7后&#xff0c;角色說出的內容是&#xff1f; A&#xff1a;4&#xff0c;7 B&#xff1a;7&#xff0c;7 C&#xff1a;7&#xff0c;4 D&#xff1a;4&#xff0c;4 2.執行下面程序&#xff0c;輸出是&#xff…

Oracle自帶的網絡工具(計算傳輸redo需要的帶寬,使用STATSPACK,計算redo壓縮率,db_ultra_safe)

--根據primary database redo產生的速率,計算傳輸redo需要的帶寬. 除去tcp/ip網絡其余30%的開銷,計算需要的帶寬公式: 需求帶寬((每秒產生redo的速率峰值/0.75)*8)/1,000,000帶寬(Mbps) --可以通過去多次業務高峰期的Statspack/AWR獲取每秒產生redo的速率峰值,也可以通過查詢視…

post請求體內容無法重復獲取

post請求體內容無法重復獲取 為什么會無法重復讀取呢&#xff1f; 以tomcat為例&#xff0c;在進行請求體讀取時實際底層調用的是org.apache.catalina.connector.Request的getInputStream()方法&#xff0c;而該方法返回的是CoyoteInputStream輸入流 public ServletInputStream…

CVE-2016-5195 復現記錄

文章目錄 poc前置知識頁表與缺頁異常/proc/self/mem的寫入流程madvise 漏洞點修復 Dirty COW臟牛漏洞是一個非常有名的Linux競爭條件漏洞&#xff0c;雖然早在2016年就已經被修復&#xff0c;但它依然影響著眾多古老版本的Linux發行版&#xff0c;如果需要了解Linux的COW&#…

Redis7 實現持久化的三種方式

1、概述 1.1、Redis持久化的重要性 數據恢復&#xff1a;Redis是一個內存數據庫&#xff0c;如果系統或服務宕機&#xff0c;內存中的數據將會丟失。Redis的持久化機制可以把數據保存到磁盤上&#xff0c;以便在系統重啟后恢復數據。這是Redis持久化最基本也是最重要的功能。…

JCL中IEFBR14和COND

JCL中IEFBR14和COND ? COND CODE&#xff0c;就是反映JCL中STEP運行狀態的參數&#xff0c;JCL正常終了的COND CODE 是0000&#xff0c;另外筆者在執行某些工具JCL時候&#xff0c;比方說簡單一個COMPARE吧&#xff0c;可能會出現0012、0004或者0016&#xff0c;0001&#xf…

JSON與Object等的相互轉換

JSON與Object的轉換 // 將 Object 對象轉換為 String 類型 String jsonString = JSON.toJSONString(body);// 將 String 或 byte[] 轉換為 JSONObject 類型 JSONObject jsonObject = JSONObject.parseObject(jsonString); // 根據鍵key獲取 JSONObject 中的某一個鍵值對的值 S…

數據結構:棧和隊列的實現附上源代碼(C語言版)

目錄 前言 1.棧 1.1 棧的概念及結構 1.2 棧的底層數據結構選擇 1.2 數據結構設計代碼&#xff08;棧的實現&#xff09; 1.3 接口函數實現代碼 &#xff08;1&#xff09;初始化棧 &#xff08;2&#xff09;銷毀棧 &#xff08;3&#xff09;壓棧 &#xff08;4&…

金三銀四求職攻略:如何在面試中脫穎而出

隨著春天的腳步漸近&#xff0c;對于眾多程序員來說&#xff0c;一年中最繁忙、最重要的時期也隨之而來。金三銀四&#xff0c;即三月和四月&#xff0c;被廣大程序員視為求職的黃金時段。在這段時間里&#xff0c;各大公司紛紛開放招聘&#xff0c;求職者們則通過一場又一場的…