【Android NDK 开发】NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 获取 tombstone_0X 崩溃日志信息 )

简介: 【Android NDK 开发】NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 获取 tombstone_0X 崩溃日志信息 )

文章目录

一、崩溃信息描述

二、手机命令行操作

三、电脑命令行操作

四、Tombstone 内容



Tombstone 报错信息日志文件被保存在了 /data/tombstones/ 目录下 , 先 ROOT 再说 , 没有 ROOT 权限无法访问该目录中的信息 ;


使用 Pixel 2 手机进行调试 , 其它 ROOT 后的手机也可以使用 ;


ROOT 前先 解锁 Bootloader , 参考博客 【Android】Pixel 2 解锁 Bootloader


ROOT 操作 , 参考博客 【Android】Pixel 2 Android 9 系统 ROOT 操作 ( TWRP 下载 | Magisk Manager 下载 | 线刷包下载 | 线刷 9.0 系统 | ROOT 操作 )






一、崩溃信息描述


2020-11-12 09:21:47.476 11561-11575/com.tombstone.demo A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc in tid 11575 (Binder:11561_3), pid 11561 (process)
2020-11-12 09:21:47.539 11606-11606/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG: Build fingerprint: 'google/walleye/walleye:9/PQ3A.190801.002/5670241:user/release-keys'
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG: Revision: 'MP1'
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG: ABI: 'arm64'
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG: pid: 11561, tid: 11575, name: Binder:11561_3  >>> com.tombstone.demo:process <<<
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG: Cause: null pointer dereference
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG: Abort message: 'art_method.cc:611] Check failed: existing_entry_point != nullptr void android.accessibilityservice.AccessibilityService.<init>()@0x7e70e6f588'
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG:     x0  0000000000000000  x1  0000000000000000  x2  0000007e86085ca1  x3  0000000000000000
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG:     x4  0000000000000000  x5  0000007e7dc69b6f  x6  000000000000000a  x7  000000000000000a
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG:     x8  7af92b4d5bbf85bd  x9  7af92b4d5bbf85bd  x10 0000000000000000  x11 0000007f068804a8
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG:     x12 20646c6568207c20  x13 3d7365786574756d  x14 00000000ffffffff  x15 0000007f0687fc18
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG:     x16 0000007e8612bef0  x17 0000007f097679b0  x18 0000007f0687f69a  x19 0000007f06880480
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG:     x20 0000000000000000  x21 0000007e86051f10  x22 0000000000000000  x23 0000007e70e6f588
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG:     x24 0000000000000001  x25 0000000000000000  x26 0000000000000000  x27 0000007e863434a0
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG:     x28 0000000000000001  x29 0000007f068802c0
2020-11-12 09:21:47.540 11606-11606/? A/DEBUG:     sp  0000007f068802b0  lr  0000007e85f9162c  pc  0000007e85f91630
2020-11-12 09:21:47.566 11606-11606/? A/DEBUG: backtrace:
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #00 pc 00000000004a5630  /system/lib64/libart.so (art::CurrentMethodVisitor::VisitFrame()+24)
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #01 pc 0000000000484608  /system/lib64/libart.so (_ZN3art12StackVisitor9WalkStackILNS0_16CountTransitionsE0EEEvb+1656)
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #02 pc 0000000000495d9c  /system/lib64/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool, BacktraceMap*, bool) const+316)
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #03 pc 00000000004afd5c  /system/lib64/libart.so (art::DumpCheckpoint::Run(art::Thread*)+844)
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #04 pc 00000000004a8a9c  /system/lib64/libart.so (art::ThreadList::RunCheckpoint(art::Closure*, art::Closure*)+476)
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #05 pc 00000000004a7cd4  /system/lib64/libart.so (art::ThreadList::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool)+500)
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #06 pc 000000000046a9d0  /system/lib64/libart.so (art::Runtime::Abort(char const*)+392)
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #07 pc 0000000000008d2c  /system/lib64/libbase.so (android::base::LogMessage::~LogMessage()+724)
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #08 pc 00000000000d07f0  /system/lib64/libart.so (art::ArtMethod::GetOatQuickMethodHeader(unsigned long)+608)
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #09 pc 00000000001a0d0c  /system/lib64/libart.so (art::FaultManager::IsInGeneratedCode(siginfo*, void*, bool)+908)
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #10 pc 00000000001a0654  /system/lib64/libart.so (art::FaultManager::HandleFault(int, siginfo*, void*)+92)
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #11 pc 0000000000002b80  /system/bin/app_process64 (art::SignalChain::Handler(int, siginfo*, void*)+568)
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #12 pc 000000000000088c  [vdso:0000007f0bc35000]
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #13 pc 0000000000553bcc  /system/lib64/libart.so (ExecuteMterpImpl+33356)
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #14 pc 0000000000390f46  /system/framework/boot-framework.vdex (android.app.ContextImpl.sendBroadcast+94)
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #15 pc 0000000000255e68  /system/lib64/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.2088410233+496)
2020-11-12 09:21:47.567 11606-11606/? A/DEBUG:     #16 pc 000000000025b9e8  /system/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+216)
2020-11-12 09:21:47.781 941-941/? E//system/bin/tombstoned: Tombstone written to: /data/tombstones/tombstone_00


在上述崩溃信息的最后给出了提示 “Tombstone written to: /data/tombstones/tombstone_00” , 崩溃日志信息被保存到了 /data/tombstones/tombstone_00 文件中 ;






二、手机命令行操作


进入手机的命令行 ;


adb shell


获取 root 权限 ;


su


进入 /data/tombstones/ 目录 ;


cd /data/tombstones/

查看该目录下的崩溃日志文件 ;


ls


下面的截图中可以看到 , 上述崩溃日志 tombstone_00 ;




首先将该日志文件拷贝到 /sdcard/ 目录 ;


cp /data/tombstones/tombstone_00 /sdcard/tombstone_00

image.png



手机命令行操作完毕 , 执行两次 exit , 第一次退出 root 模式 , 第二次退出手机命令行 ;


exit
exit

image.png




三、电脑命令行操作


之前在手机命令行中 , 我们将 /data/tombstones/tombstone_00 的崩溃日志文件拷贝到了 sd 卡中 , /sdcard/tombstone_00 ;


adb pull 命令无法从 /data/ 目录中直接拉取文件 , 拷贝到 sd 卡中 , 就可以从 sd 卡拉取该文件 ;


将 /sdcard/tombstone_00 崩溃日志文件拉取到本地 ;


adb pull /sdcard/tombstone_00 .




这样就获取到了 tombstone_00 文件 ;


image.png




四、Tombstone 内容


打开后查看其中的大致内容 :


*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'google/walleye/walleye:9/PQ3A.190801.002/5670241:user/release-keys'
Revision: 'MP1'
ABI: 'arm64'
pid: 11561, tid: 11575, name: Binder:11561_3  >>> com.tombstone.demo:process <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc
Cause: null pointer dereference
Abort message: 'art_method.cc:611] Check failed: existing_entry_point != nullptr void android.accessibilityservice.AccessibilityService.<init>()@0x7e70e6f588'
    x0  0000000000000000  x1  0000000000000000  x2  0000007e86085ca1  x3  0000000000000000
    x4  0000000000000000  x5  0000007e7dc69b6f  x6  000000000000000a  x7  000000000000000a
    x8  7af92b4d5bbf85bd  x9  7af92b4d5bbf85bd  x10 0000000000000000  x11 0000007f068804a8
    x12 20646c6568207c20  x13 3d7365786574756d  x14 00000000ffffffff  x15 0000007f0687fc18
    x16 0000007e8612bef0  x17 0000007f097679b0  x18 0000007f0687f69a  x19 0000007f06880480
    x20 0000000000000000  x21 0000007e86051f10  x22 0000000000000000  x23 0000007e70e6f588
    x24 0000000000000001  x25 0000000000000000  x26 0000000000000000  x27 0000007e863434a0
    x28 0000000000000001  x29 0000007f068802c0
    sp  0000007f068802b0  lr  0000007e85f9162c  pc  0000007e85f91630
backtrace:
    #00 pc 00000000004a5630  /system/lib64/libart.so (art::CurrentMethodVisitor::VisitFrame()+24)
    #01 pc 0000000000484608  /system/lib64/libart.so (_ZN3art12StackVisitor9WalkStackILNS0_16CountTransitionsE0EEEvb+1656)
    #02 pc 0000000000495d9c  /system/lib64/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool, BacktraceMap*, bool) const+316)
    #03 pc 00000000004afd5c  /system/lib64/libart.so (art::DumpCheckpoint::Run(art::Thread*)+844)
    #04 pc 00000000004a8a9c  /system/lib64/libart.so (art::ThreadList::RunCheckpoint(art::Closure*, art::Closure*)+476)
    #05 pc 00000000004a7cd4  /system/lib64/libart.so (art::ThreadList::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool)+500)
    #06 pc 000000000046a9d0  /system/lib64/libart.so (art::Runtime::Abort(char const*)+392)
    #07 pc 0000000000008d2c  /system/lib64/libbase.so (android::base::LogMessage::~LogMessage()+724)
    #08 pc 00000000000d07f0  /system/lib64/libart.so (art::ArtMethod::GetOatQuickMethodHeader(unsigned long)+608)
    #09 pc 00000000001a0d0c  /system/lib64/libart.so (art::FaultManager::IsInGeneratedCode(siginfo*, void*, bool)+908)
    #10 pc 00000000001a0654  /system/lib64/libart.so (art::FaultManager::HandleFault(int, siginfo*, void*)+92)
    #11 pc 0000000000002b80  /system/bin/app_process64 (art::SignalChain::Handler(int, siginfo*, void*)+568)
    #12 pc 000000000000088c  [vdso:0000007f0bc35000]
    #13 pc 0000000000553bcc  /system/lib64/libart.so (ExecuteMterpImpl+33356)
    #14 pc 0000000000390f46  /system/framework/boot-framework.vdex (android.app.ContextImpl.sendBroadcast+94)
    #15 pc 0000000000255e68  /system/lib64/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.2088410233+496)
    #16 pc 000000000025b9e8  /system/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+216)
stack:
         0000007f06880230  0000007e86343400  [anon:libc_malloc]
         0000007f06880238  000000000000000b
         0000007f06880240  0000000000002d37
         0000007f06880248  0000007e86059197  /system/lib64/libart.so
         0000007f06880250  0000007f06880580  [anon:thread signal stack]
         0000007f06880258  7af92b4d5bbf85bd
         0000007f06880260  0000000000000001
         0000007f06880268  0000007e70e6f588  <anonymous:0000007e70d74000>
         0000007f06880270  0000000000000001
         0000007f06880278  0000007e70e6f588  <anonymous:0000007e70d74000>
         0000007f06880280  0000000000000000
         0000007f06880288  0000007e86051f10  /system/lib64/libart.so (art_quick_instrumentation_exit)
         0000007f06880290  0000000000000000
         0000007f06880298  0000007f06880480  [anon:thread signal stack]
         0000007f068802a0  0000007f068802c0  [anon:thread signal stack]
         0000007f068802a8  0000007e85f9162c  /system/lib64/libart.so (_ZN3art20CurrentMethodVisitor10VisitFrameEv+20)
    #00  0000007f068802b0  0000000000000000
         ........  ........
    #01  0000007f068802d0  0000040000000000
         ........  ........
    #02  0000007f06880480  0000007e86123170  /system/lib64/libart.so
         ........  ........
    #03  0000007f06880540  615b202020202020
         ........  ........
    #04  0000007f068806f0  0000007f068809e8  [anon:thread signal stack]
         ........  ........
    #05  0000007f06880940  0000007f068809c0  [anon:thread signal stack]
         ........  ........
    #06  0000007f06880a80  0000000b86057ea1
         ........  ........
    #07  0000007f06880b00  0000007f06880b70  [anon:thread signal stack]
         ........  ........
    #08  0000007f06880b80  0000000000000000
         ........  ........
    #09  0000007f06880c00  0000007e70e6c9b0  <anonymous:0000007e70d74000>
         ........  ........
    #10  0000007f06880c90  0000000000000002
         ........  ........
    #11  0000007f06880d10  0000007f06880da0  [anon:thread signal stack]
         ........  ........
    #12  0000007f06880da0  000000000000000b
         ........  ........
    #13  0000007e70e6c9b0  0000007e70e6f588  <anonymous:0000007e70d74000>
         ........  ........
    #14  0000007e70e6ca00  0000007e86343400  [anon:libc_malloc]
         ........  ........
    #15  0000007e70e6ca00  0000007e86343400  [anon:libc_malloc]
         ........  ........
    #16  0000007e70e6cac0  0000000000000008
         0000007e70e6cac8  0000007e6e9e5268  /data/app/com.tombstone.demo-h00jR9L0Nz3hIKifxKrl5Q==/lib/arm64/liboboe.so (Java_com_tombstone_demo_OboePlayer_play+388)
         0000007e70e6cad0  0000000000000000
         0000007e70e6cad8  0000000000000000
         0000007e70e6cae0  0000000000000000
         0000007e70e6cae8  0000000000000000
         0000007e70e6caf0  0000000000000000
         0000007e70e6caf8  0000000000000000
         0000007e70e6cb00  0000000000000000
         0000007e70e6cb08  0000000000000000
         0000007e70e6cb10  0000000000000000
         0000007e70e6cb18  0000000000000000
         0000007e70e6cb20  0000000000000000
         0000007e70e6cb28  0000000000000000
         0000007e70e6cb30  0000000000000000
         0000007e70e6cb38  0000000000000000
memory near x2 (/system/lib64/libart.so):
    0000007e86085c80 6f6e207361772064 6863617474612074  d was not attach
    0000007e86085c90 7572206f74206465 0a2921656d69746e  ed to runtime!).
    0000007e86085ca0 656e72656b202000 726f624100203a6c  .  kernel: .Abor
    0000007e86085cb0 72687420676e6974 7544000a3a646165  ting thread:..Du
    0000007e86085cc0 6c6120676e69706d 646165726874206c  mping all thread
    0000007e86085cd0 756f687469772073 706f727070612074  s without approp
    0000007e86085ce0 6f6c206574616972 646c656820736b63  riate locks held
    0000007e86085cf0 616572687420003a 6c207473696c2064  :. thread list l
    0000007e86085d00 74756d20006b636f 636f6c20726f7461  ock. mutator loc
    0000007e86085d10 6874206c6c41006b 000a3a7364616572  k.All threads:..
    0000007e86085d20 20676e69646e6550 6f69747065637865  Pending exceptio
    0000007e86085d30 424147495300206e 5542474953005452  n .SIGABRT.SIGBU
    0000007e86085d40 4550464749530053 004c4c4947495300  S.SIGFPE.SIGILL.
    0000007e86085d50 0045504950474953 0056474553474953  SIGPIPE.SIGSEGV.
    0000007e86085d60 4c464b5453474953 4152544749530054  SIGSTKFLT.SIGTRA
    0000007e86085d70 4c4c49003f3f0050 0043504f4c4c495f  P.??.ILL_ILLOPC.
memory near x5 ([anon:libc_malloc]):
    0000007e7dc69b48 636f6c2074726f62 6174756d2220226b  bort lock" "muta
    0000007e7dc69b58 6b636f6c20726f74 6465726168732822  tor lock"(shared
    0000007e7dc69b68 000a29646c656820 0000000000000000   held)..........
    0000007e7dc69b78 0000000000000000 c110000040e00000  ...........@....
    0000007e7dc69b88 0000000000000000 00000000c1600000  ..........`.....
    0000007e7dc69b98 00000000c1600000 00000000bf8d6000  ..`......`......
    0000007e7dc69ba8 3f654000c0000000 40000000c0000000  .....@e?.......@
    0000007e7dc69bb8 0000000000000000 4160000000000000  ..............`A
    0000007e7dc69bc8 4160000000000000 3f8d600000000000  ......`A.....`.?
    0000007e7dc69bd8 400000003f654000 4000000040000000  .@e?...@...@...@
    0000007e7dc69be8 0000000000000000 0000000041600000  ..........`A....
    0000007e7dc69bf8 0000000041600000 000000003f8d6000  ..`A.....`.?....
    0000007e7dc69c08 bf65400040000000 c000000040000000  ...@.@e....@....
    0000007e7dc69c18 0000000000000000 c160000000000000  ..............`.
    0000007e7dc69c28 c160000000000000 bf8d600000000000  ......`......`..
    0000007e7dc69c38 c0000000bf654000 c0000000c0000000  .@e.............


分析上述 Stack , 基本可以根据如下日志 , 将错误定位到 NDK 方法 Java_com_tombstone_demo_OboePlayer_play 中 ;


 

#16  0000007e70e6cac0  0000000000000008
         0000007e70e6cac8  0000007e6e9e5268  /data/app/com.tombstone.demo-h00jR9L0Nz3hIKifxKrl5Q==/lib/arm64/liboboe.so (Java_com_tombstone_demo_OboePlayer_play+388)



相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
11月前
|
存储 运维 监控
SelectDB 实现日志高效存储与实时分析,完成任务可领取积分、餐具套装/水杯/帆布包!
SelectDB 实现日志高效存储与实时分析,完成任务可领取积分、餐具套装/水杯/帆布包!
|
6月前
|
监控 安全 搜索推荐
使用EventLog Analyzer进行日志取证分析
EventLog Analyzer助力企业通过集中采集、归档与分析系统日志及syslog,快速构建“数字犯罪现场”,精准追溯安全事件根源。其强大搜索功能可秒级定位入侵时间、人员与路径,生成合规与取证报表,确保日志安全防篡改,大幅提升调查效率,为执法提供有力证据支持。
240 0
|
11月前
|
监控 测试技术 Go
告别传统Log追踪!GOAT如何用HTTP接口重塑代码监控
本文介绍了GOAT(Golang Application Tracing)工具的使用方法,通过一个Echo问答服务实例,详细展示了代码埋点与追踪技术的应用。内容涵盖初始化配置、自动埋点、手动调整埋点、数据监控及清理埋点等核心功能。GOAT适用于灰度发布、功能验证、性能分析、Bug排查和代码重构等场景,助力Go项目质量保障与平稳发布。工具以轻量高效的特点,为开发团队提供数据支持,优化决策流程。
686 89
|
11月前
|
SQL 监控 数据挖掘
SLS 重磅升级:超大规模数据实现完全精确分析
SLS 全新推出的「SQL 完全精确」模式,通过“限”与“换”的策略切换,在快速分析与精确计算之间实现平衡,满足用户对于超大数据规模分析结果精确的刚性需求。标志着其在超大规模日志数据分析领域再次迈出了重要的一步。
758 118
|
8月前
|
编解码 Java Android开发
安卓虚拟摄像头免root版,虚拟摄像头替换真实摄像头,jar代码开源分享
通过动态替换摄像头输入流的方式实现虚拟摄像头功能,代码经过简化展示核心逻辑。实际开发中还需要考虑视频编解码优化
|
8月前
|
监控 安全 NoSQL
【DevOps】Logstash详解:高效日志管理与分析工具
Logstash是ELK Stack核心组件之一,具备强大的日志收集、处理与转发能力。它支持多种数据来源,提供灵活的过滤、转换机制,并可通过插件扩展功能,广泛应用于系统日志分析、性能优化及安全合规等领域,是现代日志管理的关键工具。
1206 0
|
10月前
|
自然语言处理 监控 安全
阿里云发布可观测MCP!支持自然语言查询和分析多模态日志
阿里云可观测官方发布了Observable MCP Server,提供了一系列访问阿里云可观测各产品的工具能力,包含阿里云日志服务SLS、阿里云应用实时监控服务ARMS等,支持用户通过自然语言形式查询
1434 0
阿里云发布可观测MCP!支持自然语言查询和分析多模态日志
|
12月前
|
存储 消息中间件 缓存
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
基于阿里云SelectDB,MiniMax构建了覆盖国内及海外业务的日志可观测中台,总体数据规模超过数PB,日均新增日志写入量达数百TB。系统在P95分位查询场景下的响应时间小于3秒,峰值时刻实现了超过10GB/s的读写吞吐。通过存算分离、高压缩比算法和单副本热缓存等技术手段,MiniMax在优化性能的同时显著降低了建设成本,计算资源用量降低40%,热数据存储用量降低50%,为未来业务的高速发展和技术演进奠定了坚实基础。
536 1
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
|
9月前
|
人工智能 运维 监控
Aipy实战:分析apache2日志中的网站攻击痕迹
Apache2日志系统灵活且信息全面,但安全分析、实时分析和合规性审计存在较高技术门槛。为降低难度,可借助AI工具如aipy高效分析日志,快速发现攻击痕迹并提供反制措施。通过结合AI与学习技术知识,新手运维人员能更轻松掌握复杂日志分析任务,提升工作效率与技能水平。
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。