MinGW编译平台的应用程序使用libcef.dll,当调用cef的capi接口时程序崩溃。调试单步到cef capi函数时,调试器报错“Cannot find bounds of current function”。

解决问题的思路在https://stackoverflow.com/questions/8741493/why-i-do-get-cannot-find-bound-of-current-function-when-i-overwrite-the-ret-ad

在windows平台需要使用嵌入浏览器cef,同时要使用c++11,又不想安装庞大的VS开发环境。选用了codeblocks-17.12mingw-nosetup作为开妇环境,压缩包不到100MB,MinGW gcc为2015年的5.1.0版本。支持同等c++11特性的vc编译器,应该是VS2015,即使是express版也有5G庞大。

http://opensource.spotify.com/cefbuilds/index.html#windows32_builds找到最低版本的libcef.3.2704.1414,体积约50M。笔者在其它软件找到体积更小,只有40M的libcef.dll.3.2171。如果不迷恋c++wrapper的话,下载后的cefbuild直接可以使用capi。如果已经习惯了<<inside c++ object model>>的思维和c面向对象的思维,就明白其实cef的capi已经经过面向对象思想设计。

有了开发环境codeblocks+MinGw,现成的库文件libcef.dll.3.2171,还有接口头文件libcef.3.2704.1414.zip。只要将win32的库文件转换成MinGw的链接库就可以使用。自然就是使用MinGw的工具导出def,然后导出.a库文件。

经过一番适配调整配置后,程序编译链接成功,但是运行失败了, 调试时gcc在运行cef capi处报错"Cannot find bounds of current function"。

这个错误并非没有加载到库文件,或者是没有加载到函数,而是函数边界问题。在stackoverflow有post讨论回答“It overwrites the current stack frame of your function with irrelevant data, and destroys the return address in the process, which is normally stored there among other things”。就是函数调用的栈帧被破坏。这事情在win平台开发比较常见, stdcall与cdecl,callee和caller谁负责平衡堆栈的问题,不一致时使得栈帧被破坏。WINAPI以及CALLBACK就是stdcall。而cef项目却有这么一个CEF_CALLBACK对win操作平台下的回调约定,自然就是stdcall。早期cef项目(这里指本文采用的3.27xx于2016年)不考虑对MinGW支持,预编译只有两大平台的分支COMPILER_MSVC与COMPLIER_GCC,诡异的就是MinGW是在WINOS上的GCC,所有十分尴尬。最新版的cef将CEF_CALLBACK的定义单独放置在一个预编译分支OS_WIN。

CEF_CALLBACK的定义在internal/cef_export.h。下面两个版本的文件对照:

3.2704.1414

#if defined(COMPILER_MSVC)

#ifdef BUILDING_CEF_SHARED
#define CEF_EXPORT __declspec(dllexport)
#elif USING_CEF_SHARED
#define CEF_EXPORT __declspec(dllimport)
#else
#define CEF_EXPORT
#endif
#define CEF_CALLBACK __stdcall #elif defined(COMPILER_GCC) #define CEF_EXPORT __attribute__ ((visibility("default")))
#define CEF_CALLBACK #endif // COMPILER_GCC #endif // CEF_INCLUDE_INTERNAL_CEF_EXPORT_H_

78.3.9

#if defined(COMPILER_MSVC)

#ifdef BUILDING_CEF_SHARED
#define CEF_EXPORT __declspec(dllexport)
#elif USING_CEF_SHARED
#define CEF_EXPORT __declspec(dllimport)
#else
#define CEF_EXPORT
#endif #elif defined(COMPILER_GCC) #define CEF_EXPORT __attribute__((visibility("default"))) #endif // COMPILER_GCC #if defined(OS_WIN)
#define CEF_CALLBACK __stdcall
#else
#define CEF_CALLBACK
#endif

问题迎刃而解。

Cannot find bounds of current function的更多相关文章

  1. GDB错误:Cannot find bounds of current function

    http://blog.csdn.net/zoomdy/article/details/17249165 mingdu.zheng <at> gmail <dot> com 使 ...

  2. Dynamics 365中计算字段与Now进行计算实体导入报错:You can't use Now(), which is of type DateTime, with the current function.

    微软动态CRM专家罗勇 ,回复338或者20190521可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me. 计算字段是从Dynamics CRM 2015 SP1版本开始推 ...

  3. linux网络编程学习笔记之五 -----并发机制与线程�

    进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省 ...

  4. 2018-2019-1 20189210 《LInux内核原理与分析》第六周作业

    系统调用实验(下): 将第四章的两个实验集成到MenuOS系统中,将其作为MenuOS系统的两个命令,新版本的menu中已经把两个系统调用添加进去了,只需重新克隆一个新版本的menu. 使用make ...

  5. 基于Linux-3.9.4内核的GDB跟踪系统调用实验

    382 + 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 一.实验环境 win10 -> VMware -> Ubuntu1 ...

  6. 2018-2019-1 20189221 《Linux内核原理与分析》第六周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第六周作业 实验五 实验过程 将Fork函数移植到Linux的MenuOS fork()函数通过系统调用创建一个与原来 ...

  7. 2018-2019-1 20189218《Linux内核原理与分析》第六周作业

    向menuOS中增加命令 修改menu目录下的test.c文件,增加自己的函数定义,并在修改main()函数,按照前面的menuconfig的写法写好自己的menuconfig. 我选择的是acces ...

  8. GNU :6.47 Function Names as Strings

    链接:http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html#Function-Names GCC provides three magic var ...

  9. Function Names as Strings

    [Function Names as Strings] GCC provides three magic variables that hold the name of the current fun ...

随机推荐

  1. qtcreator cannot find catkin packages

    adding /opt/ros/kinetic to CMAKE_PREFIX_PATH in Project -> build environment only /opt/ros/kineti ...

  2. 创建nextcloud所需的数据库和账户

      创建 nextcloud 所需的数据库和账户 打开数据库管理命令行,默认root没密码,回车进入 sudo mysql -u root -p 创建 nextcloud 数据库,命令包含后面的分号 ...

  3. 在windbg调试.net时遇到的问题

    调试.net应用程序时,有时会在windbg中收到错误消息.以下是我最常遇到的几个问题. Failed to start stack walk---启动堆栈遍历失败 如果你运行sos命令!clrsta ...

  4. 关于新版本cube.js 集成preosto 的一个说明

    实际上cubejs cli 是可以使用的,只是官方文档对于dbtype 说明的问题 使用如下命令我们可以创建prestodb 的基本项目   cubejs create -d prestodb myd ...

  5. nRF51822 主从断开连接Reason,HCI ERROR CODE :0x003E

    最近在给一个客户调主从一体的模块,基于S130,距离稍微远一点就会出现连接上后立马又断开连接的现象, 追踪了一下原因,给出的 HCI Error code 是 0x003E,暂且不知道这是什么鬼,查了 ...

  6. Tkinter 之文件管理器

    一.效果图 二.功能描述 1.打开文件菜单中的打开按钮,可以选择目录. 2.可以查看各种类型的图片. 3.可以编辑文本. 4.显示行号功能,可改变目录显示的宽度. 三.使用的标签 1.Menu 2.F ...

  7. 使用OSCache优化性能,及JPA二级缓存

    1.使用静态化页面技术: 要统计产品的浏览次数: 在<body> <img src="http://www.site.com/data/count.do?productId ...

  8. 刷题记录:[ByteCTF 2019]EZCMS

    目录 刷题记录:[ByteCTF 2019]EZCMS 一.知识点 1.源码泄露 2.MD5长度扩展攻击 3.php://filter绕过正则实现phar反序列化 刷题记录:[ByteCTF 2019 ...

  9. 【大数据作业九】安装关系型数据库MySQL 安装大数据处理框架Hadoop

    作业要求:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3161 4.简述Hadoop平台的起源.发展历史与应用现状. 列举发展过程中 ...

  10. Git创建与合并分支,撤销修改

    git回滚到指定版本并推送到远程分支(撤销已提交的修改,并已push) git reset --hard <commit ID号> git push -f git回滚到上一个版本并推送到远 ...