首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ndk C++ 编译器函数名修饰规则

5、naked call采用1-4调用约定时,如果必要的话,进入函数编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数则产生代码恢复这些寄存器内容。...一个采用C语言编译库应该考虑到使用这个库程序可能是C++程序(使用C++编译器),所以设计头文件应该注意这一点。...许多人不明白,为什么使用编译器都是VC编译器还会产生“error LNK2001”错误?...其中函数开始处保留esp到ebp中,函数结束恢复是编译器常用方法。 从函数调用看,2和1依次被push进堆栈,而在函数中又通过相对于ebp(即刚进函数堆栈指针)偏移量存取参数。...被调用函数_function处 push ebp // 保存ebp寄存器,该寄存器将用来保存堆栈栈顶指针,可以函数退出恢复 mov ebp,esp // 保存堆栈指针

2K31

Linux下GDB调试指令总结

摘要 之前写C++一些程序都是windows下,直接使用VS2017傻瓜式编译器,最近尝试摸索linux进行C++程序编译,有了一些成果!特此总结!...代码编辑器:VS Code(虽然vim很强大,但我觉得vim查看和修改少量代码更为适合,编辑整个程序文件还是用VS Code吧) 代码编译器:虽然VS Code有对应C++插件,还是感觉不舒服,所以笔者还是使用指令...代码调试器:避免不了,程序会出现bug,但是使用命令行编译出错后是没有调试信息(g++编译),因此我们需要使用gdb对程序进行调试。 ?...step (简写s):单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用函数 until(简写u):当你厌倦了一个循环体内单步跟踪,这个命令可以运行程序直到退出循环体。...list 行号:将显示当前文件“行号”为中心前后10行代码,如:list 12 list 函数名:将显示“函数名”所在函数代码,如:list main list :不带参数,将接着上一次 list

4.5K20
您找到你想要的搜索结果了吗?
是的
没有找到

是一个线程(节选)

主线程退出,支线程也将退出 当一个进程存在多个线程,如果主线程执行结束了,那么这个时候即使支线程(也可以叫工作线程)还没完成相关代码执行,支线程也会退出,也就是说,主线程一旦退出整个进程也就结束了。...崩溃原因是,当func函数调用结束后,func中局部变量t(线程对象)就会被销毁了,而此时线程函数仍然在运行。这就是所说使用std::thread类,必须保证线程运行期间,其线程对象有效。...以我机器上nginxworker进程为例,首先使用ps命令查看下nginx进程ID,然后使用pstack即可查看该进程每个线程调用堆栈这里nginx只有一个线程,如果有多个线程,会显示每个线程调用堆栈...如果使用C++面向对象方式对线程函数进行封装,那么线程函数就不能是类实例方法,即必须是静态方法。那么,为什么不能是类实例方法呢?...对于实例方法,为了保证类方法正常功能,C++编译器翻译,会将类实例对象地址(也就是this指针)作为类第一个参数合并给该方法,也就是说,翻译后threadFunc签名变成了如下形式(伪代码

2.1K40

详解CC++堆栈工作机制

结构化异常处理也是通过堆栈来实现(当你使用try…catch语句使用就是c++对windows结构化异常处理扩展),但是关于结构化异常处理主题太复杂了,本文将不会涉及到。...函数开始,对应堆栈帧已经完整地建立了(所有的局部变量函数帧建立时就已经分配好空间了,而不是随着函数执行而不断创建和销毁);函数退出,整个函数帧将被销毁。 5....,本质上并没有差别,特此说明)如图所示: 奇怪是,debug模式下,编译器为局部变量分配空间远远大于实际所需,而且局部变量之间地址不是连续(据我观察,总是间隔8个字节)如下图所示: 还不知道编译器为什么这么设计...通用寄存器入栈 最后,将函数中使用通用寄存器入栈,暂存起来,以便函数结束恢复。...所有的Windows API都使用__stdcall。其规则是:参数从右向左压入堆栈,函数退出由callee自己清理堆栈参数。

39420

C语言 | C++ 堆栈工作机制

5)结构化异常处理也是通过堆栈来实现(当你使用 try…catch 语句使用就是  c++ 对 windows 结构化异常处理扩展),但是关于结构化异常处理主题太复杂了,本文将不会涉及到。...函数开始,对应堆栈帧已经完整地建立了(所有的局部变量函数帧建立时就已经分配好空间了,而不是随着函数执行而不断创建和销毁);函数退出,整个函数帧将被销毁。...个字节)如下图所示: 图6 还不知道编译器为什么这么设计,或许是为了堆栈中插入调试数据,不过这无碍我们今天讨论。...通用寄存器入栈 最后,将函数中使用通用寄存器入栈,暂存起来,以便函数结束恢复。...所有的 Windows API 都使用 __stdcall。其规则是:参数从右向左压入堆栈,函数退出由 callee 自己清理堆栈参数。

7.7K88

计算机考研复试C语言常见面试题「建议收藏」

+模板 4 10、内存泄漏 5 11、智能指针 6 12、野指针 7 13、new与malloc区别 7 14、堆栈区 7 15、虚函数与纯虚函数 8 16、为什么析构函数必须是虚函数?...保持变量内容持久 如果作为static局部变量函数内定义,它生存期为整个源程序,但是其作用域不会发生改变,只能在定义该变量函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。...11、智能指针 智能指针作用是管理一个指针,因为普通指针申请空间函数结束时常常忘记释放,从而造成内存泄漏。...智能指针作用原理就是函数结束自动释放内存空间,不需要手动释放内存空间。...为什么C++默认析构函数不是虚函数 析构函数设置为虚函数可以保证我们new一个子类,可以使用基类指针指向该子类对象,释放基类指针可以释放掉子类空间,防止内存泄漏。

1.5K30

linux下gdb调试方法与技巧整理「建议收藏」

对于一名Linux下工作c/c++程序员,gdb是必不可少工具; 二、gdb使用流程 这里用c程序做基本演示,c++程序也是一样; 1、启动gdb 编译一个测试程序,-g表示可以调试,命令如下:...,这个命令可以运行程序直到退出循环体; until+行号: 运行至某行,不仅仅用来跳出循环; finish: 运行程序,直到当前函数完成返回,并打印函数返回堆栈地址和返回值及参数值等信息; call...step (简写s):单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用函数 until:当你厌倦了一个循环体内单步跟踪,这个命令可以运行程序直到退出循环体。...list 行号:将显示当前文件“行号”为中心前后10行代码,如:list 12 list 函数名:将显示“函数名”所在函数代码,如:list main list :不带参数,将接着上一次 list...寄存器窗口 layout split:显示源代码和反汇编窗口 Ctrl + L:刷新窗口 7、cgdb强大工具 cgdb主要功能是调试进行代码同步显示,这无疑增加了调试方便性,提高了调试效率

2.1K20

系统学习Windows客户端开发

学习地图 书籍推荐 C++ Primer Windows核心编程 TCP/IP详解 卷1:协议 设计模式GoF版 编码规范 C++编码规范 C++语言 C++宏 C++11 用正则表达式查找提取替换字符串...不建议复用窗口管理对象 CreateWindow返回空句柄而GetLastError返回0咋回事 SetTimer得注意两个坑 数据交换 详解JsonCpp库使用 数据持久化 20分钟掌握sqlite...库使用 动态库和静态库 动态库与静态库区别 程序无法启动定位技巧 进程和线程 一个简单实用线程基类 独立子线程设计 多线程下互斥访问共享资源 自动解锁与提前解锁 C++11 async那些奇怪问题...网络 一个线程搞定TCP服务器 为什么使用TCP还要自实现心跳 内存管理 Windows栈区存储格式 内存泄漏检测工具DrMemory 崩溃分析 Windbg常用命令(崩溃转储分析篇) Windows...栈区存储格式 Windbg分析不完整堆栈 Windbg分析被捕获异常堆栈 崩溃分析之非法函数调用 崩溃转储文件收集 调试分析 远程调试 程序自动退出定位技巧 再谈程序自动退出定位技巧 调试子进程刚启动代码

2.9K30

Delphi异常机制与SEH

1 、 VCL 顶层异常捕获 DELPHI开发程序中,出错时候,我们很少看到出现一个错误对话框,提示点确定结束程序,点取消调试。而在VC或VB里就很常见,这是为什么呢?...2 、消息处理时候异常处理 大家可能有疑问了,那不是意味着程序里没有TRY EXCEPT END的话,出现异常就会直接退出?那么button事件里抛出一个错误为什么没有退出呢?...try except end 实现: PASSCAL代码使用3个Sleep主要是用了观看汇编代码比较方便隔开编译器生成代码): try Sleep(1);...try except end 结构,首先挂上SEH,如果代码正常执行,执行完毕后取消SEH,这种情况比较简单。...try finally end,首先挂上SEH,如果代码正常执行,取消SEH,将try finally end后代码地址压入堆栈,再finally里代码运行完毕后,ret就返回到了该地址。

1.1K10

【笔记】《深入理解C++11》(下)

阅读并笔记途中跳过了一些之前已经总结过内容, 而对于一些自己看书后依然没搞清楚内容(例如SFINAE和内存模型)搜索资料进行了扩展, 还补充了一些原书没有介绍但稍微有所相关内容, 参考文献每一段开头给出...必须是个常量表达式 常量表达式值必须在使用前初始化, 但是如果没有代码用到其地址, 编译器可以不生成数据, 直接将常量表达式作为编译时期使用 编译浮点常量表达式精度至少要等于/高于运行时浮点数常量精度...在内存模型之前, 我们无法控制原子操作前后代码执行顺序, 因此有可能代码中本来写了yx前进行修改, 但是实际运行时候yx之后才发生修改....如果此时有线程B修改x同时读取了y, 那么就会得到不合理y值(原本期待y修改x时候已经改变) 对此C++内存模型提供了六种枚举值, 核心就是让对性能有极限要求程序员可以按照自己想法控制原子操作前后其它有关内存读写代码..., 退出时候与注册相反顺序调用 然而exit()由于会调用析构原因, 退出程序时候可能需要卸除大量堆内存导致退出速度很慢, 但是这些堆内存本来都是可以交给操作系统一口气回收.

1K30

C++11 析构函数中执行lambda表达式(std::function)捕获this指针陷阱

想说是善用lambda表达式,将给C++编程带来极大便利,这是本人最近学习C++11以来真实深切感受,但是有时候误用lambda表达式也会给编程带来极大隐患,本文最近经历说明lambda表达式使用一例陷阱...一个简单例子 下面是一段很简单lambda测试代码。总体功能就是让对象析构执行指定std::function函数对象。...这就是异常发生直接原因。。。 一开始总是纠结为什么gcc和vs2015下运行结果不一样,既然gcc下运行正常说明代码逻辑没问题,这该不会是vs2015一个bug吧?...最后一个问题:为什么gcc和vs2015下代码表现不同?...同样用前面std::function析构函数加断点方式eclipse+gcc环境下做了测试,测试结果表明gcc也是按C++标准顺序执行对象析构,但不同是gcc构造下面这个lambda表达式

1.5K10

9.1 运用API创建多线程

需要注意,使用CreateThread创建线程,线程入口函数返回值是线程退出码,而不是线程执行结果值。...通常设为NULL,表示使用默认值。 dwStackSize:指定线程堆栈大小,字节为单位。如果dwStackSize为0,则使用默认堆栈大小。...需要注意是,使用CreateThread创建线程,线程入口函数返回值是线程退出码,而不是线程执行结果值。...EnterCriticalSection 是Windows API提供线程同步函数之一,用于进入一个临界区并且锁定该区域,确保同一间只有一个线程访问临界区代码。...当使用了_beginthreadex创建线程退出,会调用_endthreadex来结束线程,这里返回值会被当做线程退出码。

20010

9.1 运用API创建多线程

需要注意,使用CreateThread创建线程,线程入口函数返回值是线程退出码,而不是线程执行结果值。...通常设为NULL,表示使用默认值。dwStackSize:指定线程堆栈大小,字节为单位。如果dwStackSize为0,则使用默认堆栈大小。...需要注意是,使用CreateThread创建线程,线程入口函数返回值是线程退出码,而不是线程执行结果值。...EnterCriticalSection 是Windows API提供线程同步函数之一,用于进入一个临界区并且锁定该区域,确保同一间只有一个线程访问临界区代码。...当使用了_beginthreadex创建线程退出,会调用_endthreadex来结束线程,这里返回值会被当做线程退出码。

18620

C++静态链接

这样,当别的编译单元也int或foat类型实例化该模板函数后,也会生成同样名字,这样链接器最终链接时候可以区分这些相同模板实例段,然后将它们合并入最后代码段。...全局构造与析构 我们知道一般一个C、C++ 程序是从main开始执行,随着main函数结束结束。...C++ 全局对象构造函数也是在这一期被执行,我们知道C++ 全局对象构造函数main之前被执行,C+全局对象析构函数main之后被执行。...因此,当一个程序main函数正常退出,Glib会安排执行这个段中代码 这两个段init和fini存在有着特别的目的,如果一个函数放到init段,main函数执行前系统就会执行它。...函数调用方式,比如参数入栈顺序、返回值如何保持等 堆栈分布方式,比如参数和局部变量堆栈位置,参数传递方法等。

1.6K10

Windows内核之进程终止和子进程

C++对象将可以使用它们析构函数得以释放 操作系统可以正确释放该线程使用堆栈内存 系统将进程退出代码设置为进入点函数返回值 系统将内核对象计数值减去1 1.2...通过调用ExitProcess函数,C++/C执行期启动代码可以确保主线程从它进入点函数返回,进程便终止执行,而无论进程中是否还有其它线程执行。...2 进程终止情况 进程中全部剩余线程将被终止 进程中指定用户对象,GDI对象被释放,内核对象被关闭 内核对象状态编程收到通知状态 进程退出代码由STILL_ACTIVE...lpExitCode)来查找进程退出代码,假设代码是STILL_ACTIVE表示是进程还没终止,假设不是这个,就说明进程已经被终止。...,所以必须等待此函数运行完成,才干运行后面的代码 3.2 开辟新线程 这样可以新线程运行时候,同一候运行其它线程代码,可是这种缺点是不同线程之间须要交流数据时候,会产生同步问题

1.7K20

解决 JavaScriptCore 垃圾回收引起崩溃

介绍 ---- 最近一直在做有关 JavaScriptCore 技术需求,上周发现一个问题,当在JavaScriptCore 垃圾回收,项目会有一定几率发生崩溃。崩溃发生时调用堆栈如下: ?...猜想2:JavaScriptCore 进行垃圾回收不允许进行 JSObjectMake 从调用堆栈来看,每次崩溃都发生在 JSObjectMake 之后,这是不是意味着垃圾回收不能进行JSObjectMake...图6 JSCore两种垃圾回收方式 而我们之所以发生崩溃是由于我们在对象垃圾回收回调中访问了堆,这个问题代码如下: ? 图7 伪代码 3....(这个问题我们并没有实现思路,如果有人知道 iOS 中如何 hook 一个 C++ 函数,请及时留言指教)。 经历了一系列尝试后,我们放弃了 hook C++ 函数方法,转而寻求其他方法。...当自动释放池释放当前runloop 一定是结束了,也就是说该垃圾回收一定是结束了(不可能一次垃圾回收分为两个 runloop )。因此只需要将代码改为如下所图11示即可 ? 图11 修改方案 4.

1.4K20

【团队分享】刀锋铁骑:常见Android Native崩溃及错误原因

王竞原,负责网游刀锋铁骑项目,高级开发工程师,使用C++已有10年,非常喜欢C++,特别是C++11。希望能与广大C++爱好者多交流。...一、什么是AndroidC/C++ NativeCrash Android上Crash可以分两种: 1、Java Crash java代码导致jvm退出,弹出“程序已经崩溃”对话框,最终用户点击关闭后进程退出...2、Native Crash 通过NDK,使用C/C++开发,导致进程收到错误信号,发生Crash,Android 5.0之前进程直接退出(闪退) , Android 5.0之后会弹“程序已崩溃”对话框...解决方法 使用指针前加以判断,如果为空,则是不可访问。 Bug评述 空指针是很容易出现一种bug,代码量大,赶开发进度很容易出现,但是它也很容易被发现和修复。 2....黑客进行攻击,输入字符串一般不会让程序崩溃,而是修改函数返回地址,使程序跳转到别的地方,转而执行黑客安排好指令,达到攻击目的。

4.1K62

【Pod Terminating原因追踪系列之二】exec连接未关闭导致事件阻塞

信号),发现有大量Goroutine卡在append方法,每次publish新exit事件都会增加一个append方法堆栈信息: [mq11ldi9wh.png] 通过查看append方法源码发现...这也就解释了为什么每次publish新对于同一个containerexit事件,都会在堆栈中增加一条append堆栈信息,因为它们都被之前一个事件阻塞住了。...深入源码定位问题原因 为了找到阻塞原因,我们找到阻塞第一个exit事件append堆栈信息再详细看一下: [h3hzww0kzr.png] 通过堆栈可以发现代码卡在了docker/daemon/...最后我们通过分析代码堆栈信息,最终定位在ProcessEvent由于pools.Copy阻塞,也会被阻塞,直到copy结束,而事件又是串行处理,因此只要有一个事件处理被阻塞,那么后面所有的事件都会被阻塞...FIFO队列用来接收containerd-shim输出,之后由内存队列写入socket,response方式返回给客户端。但我们问题还没有解决,还是不清楚为什么Write会阻塞住。

2.5K108
领券