android native层printf的一个bug

Windows Mobile开发:Native C++与.NET Compact Framework技术选型指南 在嵌入式移动开发中,Native代码与托管运行时的权衡是资源受限系统的核心命题。理解PE/COFF可执行格式与IL/JIT执行模型的本质差异,有助于把握性能确定性与开发敏捷性的根本张力。Native C++提供对内存、硬件和时序的完全控制,适用于工业PDA、实时采集等强确定性场景;而.NET Compact Framework通过精简类库与轻量级GC,在企业OA、快速迭代界面等业务密集型应用中显著降低全周期成本。二者并非替代关系,而是分层协作——Native承担‘第一公里’硬件初始化与‘最后一公里’数据落盘 阅读详情

由于我们的程序是native C层程序,在机顶盒上跑的时候,没有任何的反馈界面,调试只能通过printf或者cout打印,而我们程序本身也慢慢的由两个线程编程3个4个甚至更多;

  两个线程的时候,程序跑个半天左右就会出现卡死现象,4个线程的时候,卡死出现的时间更短了,半个小时,十来分钟就一定会卡死,而我们追踪卡死现象的方法就是添加更多的log,每次卡死的时候,打印的log都非常奇怪,经过查找,这个卡死的地方都不会有问题。


   当我们程序只有两个线程时,我们关掉一个模块的log模块,就不会有卡死问题,当时大家开始怀疑printf是不是有问题,之后做了单独测试多线程时printf的测试,都没有卡死,反而是printf和cout混用时会死掉,所以我们去掉所有cout,只留pritnf,多个线程log全开,跑起来还是会死。


   当这个问题纠结了3个月的时候,我开始怀疑是我们的调试方法太落后,根本不知道怎么去找问题,所以,开始研究gdbserver,经高手指点,得到gdb的大致方法,加之自己的摸索,前后几天,搞定

 方法大致如下:

1 修改Application.mk 里优化等级为APP_OPTIM=debug

        2 用ndk-build编译

        3 将obj/local/armeabi-v7a下的所有程序拷贝到开发板上,并拷贝一份至本机例如/dir1

        4 通过串口或者adb连接到开发板

    在开发板上 gdbserver linux机器ip:端口号 程序名


        5 在linux机器上进入到程序所在目录:

 /...../android-ndk-r8b/toolchains/arm-linux-androideabi-4.6/prebuild/linux-x86/bin/arm-linux-androideabi-gdb 程序名

此后这一步非常重要,因为之前没有走一步,或者没有设置好这一步,导致了出错时不能打印出栈信息

      (gdb)set solib-search-path /home/mydir/...../...sublib  这个目录下的所有so库全都必须跟机顶盒上的一致,才能保证出错时,系统能找出出错的位置,我的方法是,把所有需要的so库从机顶盒上拷贝出来放到这里

      (gdb) target remote 机顶盒Ip:端口号

      (gdb)c

    这个时候,等待卡死的发生吧

    等出现Program received signal SIGSEGV,Segmentation fault时,敲bt,就可以看见卡死的的栈信息了


  出乎我意料的是,每次卡死都在printf上,好吧,只能给它加锁了,加锁后,问题搞定,没有再死过



 

Windows Mobile下SQLite的Native C++轻量封装实践 SQLite是一种嵌入式关系型数据库引擎,其核心设计强调零配置、自包含与事务可靠性;在资源受限的嵌入式系统中,需绕过高级抽象、禁用异常与RTTI,并基于原生C API构建确定性访问层。Native C++封装能规避托管运行时开销,满足硬实时、低内存占用及跨语言调用需求,广泛应用于工业PDA、医疗终端、电力巡检等离线场景。本文聚焦Windows Mobile 6.5(ARMV4I/CE 5.2)平台,详解如何通过纯C导出接口、手动临界区同步、WAL日志适配与路径归一化等关键技术,实现稳定、可预测、可部署的SQ 阅读详情

相关推荐

Android系统2038年问题:从时间戳溢出到内核驱动的全链路解析

Unix时间戳是计算机系统中记录时间的基础方式,它表示自1970年1月1日以来的秒数。其原理在于使用一个整数来存储这一跨度,在32位系统中,该整数为有符号32位,最大值为2^31-1秒,这导致了著名的2038年问题——当时间到达2038年1月19日03:14:07 UTC后,数值溢出将引发时间计算错误。这一问题的技术价值在于,它揭示了系统底层时间处理机制的长期兼容性风险,直接影响需要长期稳定运行的嵌入式设备和物联网系统。在应用场景上,任何依赖系统时间进行调度、证书验证和日志记录的服务都可能受到影响,例如An

weixin_30412167的博客 430

Android的jni下LOG打印输出

1.  在Android.mk根据需要选择: LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -llog #需生成的是.so库文件 #LOCAL_LDLIBS:=-llog                                        #需生成的是.a库文件 2.  在c文件中: #include #include #define LOG_T

shareinfo2018 485

Unity与原生移动端交互:从基础桥接到高级功能集成

在移动应用开发中,跨平台引擎与原生系统的交互是实现深度功能集成的核心技术。其核心原理在于通过桥接机制,实现C#与Java/Objective-C等原生语言之间的通信,通常借助C/C++中间层来优化性能和数据转换。这项技术的价值在于,它允许开发者突破引擎限制,直接调用操作系统底层的硬件能力与系统服务,从而扩展应用的功能边界。在实际应用场景中,从简单的系统提示到复杂的相机数据流处理、第三方SDK集成(如支付与登录),都依赖于稳定高效的交互方案。本文聚焦于Unity与Android/iOS的交互实践,深入探讨了基

weixin_34007886的博客 433

问题解决:printf()函数无法打印

今天写聊天室项目,调试出了问题,查看了代码无法找到问题,于是用printf()逐行打印。 问题定位很快,然而发现打印到一半,就无法显示。进过排查,这不是程序的问题,而是printf()函数无法打印。 这个问题涉及到printf()输出缓冲的问题。 对于标准输出设备stdout,输出一般都有缓冲,当遇到刷新标志或缓冲满时才把缓冲的数据输出到标准输出设备中。 对于printf()函数,其使

痞子晶的博客 1万+

从玄戒O3看自研SoC:命名逻辑、启动流程与开发者影响

SoC(片上系统)将CPU、GPU、NPU、ISP等模块集成于单芯片,是现代移动设备的核心计算平台。芯片从命名到真正运行,需经历设计、验证、流片及复杂的启动流程,其中BootROM、U-Boot、内核引导等环节对嵌入式开发至关重要。从“玄戒O3”这一命名切入,文章拆解了自研芯片的命名规则与产品定位,通过Python状态机模拟启动流程,并展示QEMU验证内核的方法。同时,围绕BSP定制、性能调优和生态兼容,探讨了新SoC对Android应用开发与嵌入式驱动开发者的实际影响。对于希望在芯片底层建立系统认知的开发

weixin_34252090的博客 376

Unity集成MediaPipe性能优化实战:10个技巧提升AI视觉应用帧率

计算机视觉技术通过算法让机器理解图像内容,其核心原理涉及图像处理、特征提取与模型推理。在移动端和游戏开发中,实时视觉应用面临性能挑战,优化技术价值在于平衡精度与效率。针对Unity引擎集成MediaPipe进行手势识别、姿态估计等场景,性能优化成为关键。通过调整输入分辨率、精简计算图配置、利用GPU/NPU硬件加速,结合帧跳过策略与对象池技术,可显著提升帧率并降低功耗。本文聚焦MediaPipeUnityPlugin的实战优化,涵盖从基础配置到平台特定加速的完整方案。

weixin_33692284的博客 388

Android中使用printf打印信息

printf是很多人最熟悉的一个函数了,同时也是使用最多的一个函数。但是在Android中,直接使用printf是无法将信息输出到串口中显示的(除非直接通过串口运行可执行程序)。为了继续使用printf,可以使用重定向的方式,将printf的输出从STDOUT转到文件中,同时方便串口输入命令调试,也不影响日志的记录。 freopen("/data/flash/stdout.txt","w",st

jl2011的博客 1万+

Visual Studio Git 使用指南

Visual Studio 2022深度集成了Git功能,提供了直观的图形界面管理源代码。本文详细介绍了VS中Git的使用方法:从环境准备、克隆/创建仓库开始,重点讲解了"Git更改"窗口的日常操作,包括查看修改、暂存文件、提交推送等。同时涵盖了分支管理、查看历史、解决冲突等核心功能,以及储藏、重置等高级操作。文章还提供了实用技巧,如提交规范、频繁提交等最佳实践。VS的Git集成覆盖了日常开发需求,图形界面与命令行可互补使用,适合各层次开发者高效管理代码版本。

guigenyi的专栏 1572

Android Native层 libc 打印log信息-----bionic库打印log

前提 Android 系统把标准输出stdout重定向到/dev/null中,所以logcat无法查看printf()打印的log信息。 实际操作 头文件 #include “private/libc_logging.h” 需要的函数名: __libc_format_log(ANDROID_LOG_DEBUG, tag, format, msg); 实例: # include&l...

qq_22613757的博客 1147

Rocfall安装包&安装教程

Rocfall 第一步:下载安装包 下载路径: 链接:https://pan.baidu.com/s/1Dzvxzv67dSPRi7f7ZT9EeA 提取码:o9pl 第二部:安装 安装包解压 选择part1进行解压 点击Setup.exe启动安装 生成Serial Number 替换启动程序 安装完毕 素材来源于网络(禁止用于商业仅用于完成毕业设计和研究使用) 谢谢! ...

cym的博客 8707

告别Keil手动分区!用CubeMX+VS Code一键生成带Bootloader的STM32 OTA工程

本文详细介绍了如何利用STM32CubeMX和VS Code实现STM32 OTA工程的自动化构建,告别传统Keil手动分区的繁琐流程。通过图形化配置Flash分区、自动生成链接脚本以及实现Bootloader跳转逻辑,开发者可以高效完成远程升级功能开发,显著提升嵌入式开发效率。

weixin_33720956的博客 390

Android NDK学习笔记12-JNI日志打印

在Java环境中我们使用JNI时可以使用printf函数打印,但是Android环境下使用JNI,printf函数就无效了,而我们使用IDE开发工具中的LogCat视图以及Console视图里也没有任何输出。其实,Android NDK完全支持JNI本地日志调试。为了使用日志函数,我们可以按照如下步骤实现: 1.原生代码需要先包含头#includeLOCAL_PATH := $(call my-d

Android研发专栏 8996

企业微信微盘API权限避坑指南:为什么你的Python脚本无法获取文件列表?

本文深入解析了企业微信微盘API的权限模型,解释了为何即使使用超级管理员账号,Python脚本也可能因权限不足而无法获取文件列表。核心在于微盘API基于“应用身份”而非“用户身份”进行校验,应用只能访问自身创建的空间。文章提供了构建文件上传代理、利用事件回调等合规的替代方案,帮助企业实现高效数据同步。

weixin_29322553的博客 533

今天发现一个bug,不知道是什么问题,printf的问题吗,还是什么。先记下!

1 /* Note:Your choice is C IDE */ 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <dos.h> 6 7 //typedef unsigned int U32; 8 typedef ...

aitanru0942的博客 164

华为昇腾 Atlas 200I DK A2 开发板编程接口学习入门:系统安装和开发步骤、注意事项与典型案例实战

华为昇腾开发板编程接口指南:从入门到进阶 本文系统介绍了华为昇腾开发板的编程接口体系,涵盖MindXSDK和AscendCL两大核心框架。MindXSDK提供高层封装接口,适合快速搭建视觉应用;AscendCL则是底层接口,需手动管理设备内存。文章详细讲解了: 开发环境搭建步骤,包括系统配置、依赖安装 MindXSDK组件化编程流程(图像分类实例) AscendCL底层开发方法(内存管理、模型推理) 常见问题解决方案和调试技巧 两个典型应用实例(摄像头目标检测和图像分类) 针对小白开发者,推荐从MindXS

bother3000的博客 2426

纳米尺度仿真软件:GROMACS_(3).分子动力学模拟原理

分子动力学(MD)模拟是一种强大的计算方法,通过数值积分牛顿运动方程,追踪粒子在时间上的位置和速度变化,提供关于体系动力学行为的详细信息。选择合适的力场、设置初始条件、应用边界条件、控制温度和压力、选择合适的时间步长、计算能量和力,是 MD 模拟的关键步骤。通过这些步骤,可以对各种化学、生物和材料体系进行模拟和分析,揭示其结构、动力学和热力学性质。高级应用如反应路径模拟和蛋白质折叠研究,进一步扩展了 MD 模拟的应用范围。

kkchenjj的博客 1100

Android NDK与JNI开发实战:从零构建Java与C++的桥梁

在移动应用开发中,性能优化和代码复用是核心挑战。Java Native Interface(JNI)作为Java平台的标准编程接口,定义了Java虚拟机与原生代码(C/C++)之间的交互协议,是实现跨语言调用的关键技术。其原理是通过严格的函数命名规则和数据类型映射,在Java层声明native方法,在Native层实现对应函数,最终编译为动态链接库(.so文件)。这项技术的价值在于能够直接利用操作系统底层能力,显著提升计算密集型任务(如图像处理、音视频编解码)的执行效率,同时复用大量成熟的C/C++生态库。

weixin_33894640的博客 369

91、Windows网络配置:动态更新与名称解析全攻略

本文全面解析了Windows XP Professional系统中的网络配置方法,重点介绍了动态更新和名称解析两大核心功能。动态更新部分涵盖DHCP客户端、静态配置客户端、远程访问客户端和多宿主客户端的配置方法,并提供禁用动态更新和编辑Hosts文件的注意事项。名称解析部分详细讲解了NetBIOS名称解析的基础知识、WINS配置方法、B节点广播与Lmhosts文件的使用,以及WINS代理的作用和配置要点。通过操作建议流程图和关键操作步骤回顾,帮助用户快速掌握网络配置的核心技巧,适用于不同网络环境的实际需求。

blue42的博客 234

Android属性系统深度解析:property_get与property_set原理、实战与安全

在Android系统开发中,进程间通信(IPC)与系统配置管理是核心基础技术。Android属性系统作为一种基于共享内存的轻量级键值对存储机制,通过高效的跨进程数据共享,实现了系统状态广播与配置同步。其底层原理涉及init进程管理的共享内存区域与Unix Domain Socket通信,确保了数据的高效读写与权限控制。这一机制为系统服务、硬件抽象层(HAL)及Framework层提供了关键的状态管理与控制通道,广泛应用于系统启动流程调试、服务控制指令传递及硬件参数配置等场景。本文聚焦于属性系统的两个核心Na

weixin_30915275的博客 345

Cadence PSpice 仿真6:反向放大器傅里叶仿真(FFT,谐波分析)实战图文教程

总谐波失真(THD)指音频信号源通过功率放大器时,由于非线性元件所引起的输出信号比输入信号多出的额外谐波成分。比如理想运放输出为5V 1Khz的正玄波时,实际输出的信号按照傅里叶展开后不但含有5V 1KHZ的分量,还有1V 2KHZ的分量,那么多出来的1V的分量就是二次谐波,二次谐波失真系数就是20%,由于任意1个波形按照傅里叶展开是可以展开到n次的,所以除了二次谐波外,输出的信号还有3,4,5……n次谐波,随着n的变大谐波的分量会变小,总谐波失真系数就是所有谐波分量和1次谐波(基波)的比值。Cadence

fydar的博客 4959

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android 9系统级Frida-Gadget管理工具:从设计到实现

在移动安全与逆向工程领域,动态代码注入是实现应用运行时分析、Hook函数和内存修改的核心技术。其原理通常是通过ptrace等系统调用附着到目标进程,操作其内存空间,加载自定义的动态链接库(如Frida-Gadget),从而实现对应用行为的监控与干预。这项技术的价值在于能够深度洞察应用逻辑、发现安全漏洞及进行自动化测试。在Android平台上,实现系统级、持久化的动态注入面临权限、SELinux策略和进程隔离等挑战,尤其在高版本系统中更为复杂。本文聚焦于Android 9(Pie)环境,探讨如何构建一个系统级

weixin_30357231的博客 527

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android NDK开发指南:从JNI到性能优化实战

原生开发套件(NDK)是Android平台上实现高性能计算的关键技术,它通过Java Native Interface(JNI)实现Java/Kotlin与C/C++的互操作。NDK的核心价值在于提升计算密集型任务(如图像处理、3D渲染)的执行效率,实测显示某些场景性能可提升10倍以上。开发者需要掌握JNI编程模型、内存管理机制以及CMake构建系统,典型应用场景包括OpenCV集成、音视频编解码等。通过NEON指令集优化和多线程处理,可以进一步释放ARM芯片的硬件潜力。随着Rust语言的引入,NDK开发正

congjukun0600的博客 430

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Mojoc引擎:基于C/C++的跨平台游戏开发实战指南

跨平台开发是移动应用和游戏开发领域的关键技术,旨在通过一套代码库覆盖Android和iOS等多个平台,从而显著降低开发成本和维护复杂度。其核心原理在于构建一个抽象层,将平台无关的业务逻辑与平台特定的系统接口(如渲染、输入、文件系统)进行分离。对于追求极致性能的游戏、图形渲染和音视频处理应用,C/C++因其对硬件资源的直接控制能力和跨编译器支持,成为实现高性能跨平台逻辑的理想选择。通过原生桥接技术(如Android的JNI和iOS的Objective-C++),C/C++核心代码可以编译为各平台的原生库,确保

diyu8056的博客 546

.NET十年演进:从Core 1.0到.NET 10的底层重构全景

.NET 是微软推出的跨平台、高性能通用开发平台,其核心演进围绕运行时统一、类库裁剪与资源控制三大技术主线。自 .NET Core 1.0 实现零 Windows 依赖起,通过模块化 coreclr、多平台 JIT 及 SDK 自包含分发,奠定云原生基础;.NET 5 推动 BCL 源码统一与目标框架(TFM)标准化,实现‘一次编译、多端运行’;.NET 6 起的 Minimal Hosting 与 .NET 8 的 Native AOT 进一步将优化粒度下沉至方法级与编译期,达成内存精简、启动加速与容器深

dejz8829的专栏 431

Unity深度调试:从源码编译可调试mono.dll的完整实践指南

在软件开发中,调试是定位和修复问题的核心环节,而符号文件(如PDB)是实现源码级调试的关键。对于Unity开发者而言,官方发布的mono.dll默认不包含调试符号,限制了在复杂场景下的深度问题排查能力。通过从Unity官方提供的Mono源码进行编译,开发者可以生成附带完整调试信息的定制版本,从而实现对托管代码和运行时内部机制的透明观测。这一技术方案不仅解决了发布版本中诡异Bug的追踪难题,还为性能优化、内存分析及第三方库集成问题提供了底层支持。本文将以Unity引擎为例,详细阐述如何通过环境配置、源码修改和

weixin_33922672的博客 376

5分钟掌握:micro-ecc轻量级椭圆曲线密码库深度解析与实战指南

micro-ecc是一个专为嵌入式系统和资源受限环境设计的轻量级椭圆曲线密码学(ECC)实现库,支持ECDH(椭圆曲线Diffie-Hellman密钥交换)和ECDSA(椭圆曲线数字签名算法)功能。这个C语言编写的库以其极小的代码体积、高效的性能表现和抵抗侧信道攻击的特性,成为物联网设备、嵌入式系统和微控制器应用中的首选密码学解决方案。 ## 📊 项目概览与技术架构 micro-ecc采用模

gitblog_00551的博客 445
上一篇: native方式获取android4.0鼠标指针速度
下一篇: android native C开发时遇到的自定义文件问题
yaotinging
博客等级 码龄18年 7粉丝 15原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值