我得到一个相当长且令人困惑的链接错误,并且如果我可以将它粘贴到某个网站上的某个文本框中并且让我的名字没有被破坏,那就会喜欢它.
有谁知道这样的服务?
我已经c++filt
命令解码一个符号,相反的工具是什么,并修改一个符号名称?
如果我想调用dlsym()
一个受损的C++函数名,这将非常有用.我宁愿不对代码中的名称进行硬编码,因为由于新的编译器版本或新编译器品牌的使用或目前由于编译多个平台而导致其随着时间的推移而发生变化.
是否有一种编程方式来获取在运行时表示C++函数的字符串,以便代码独立于编译器?可能这样做的一种方法是在编译时调用实用程序,为正在使用的编译器执行名称修改,并将适当的受损的C++符号名称插入到字符串中dlsym()
以供使用.
这是我在这个站点上找到的最接近解决方案的方法,它通过使用固定的C样式名称来间接到您希望在库中定义的C++符号来实现dlsym()
,但是如果您无法控制该库的内容提供,这不是一个选择.
在Mac机器上编译Swift时,会libswiftDemangle.dylib
创建一个动态库.我也需要在Linux机器上创建的动态库,但是,在编译源代码之后不会创建动态库.
该文件CMakeLists.txt
在lib/SwiftDemangle/CMakeLists.txt
包含:
add_swift_library(swiftDemangle SHARED
SwiftDemangle.cpp
MangleHack.cpp
LINK_LIBRARIES swiftBasic)
Run Code Online (Sandbox Code Playgroud)
指令,但是没有创建库.
我使用此命令./swift/utils/build-script -R -c --build-subdir build --install-prefix /mnt/servers/swift/install -j4
来构建项目,最终运行cmake
并ninja
构建项目.
有任何想法吗?
我在GCC C++编译器上运行代码,输出type_info :: name:
#include <iostream>
#include <typeinfo>
using namespace std;
class shape {
protected:
int color;
public:
virtual void draw() = 0;
};
class Circle: public shape {
protected:
int color;
public:
Circle(int a = 0): color(a) {};
void draw();
};
void Circle::draw() {
cout<<"color: "<<color<<'\n';
}
class triangle: public shape {
protected:
int color;
public:
triangle(int a = 0): color(a) {};
void draw();
};
void triangle::draw() {
cout<<"color: "<<color<<'\n';
}
int main() {
Circle* a;
triangle* b; …
Run Code Online (Sandbox Code Playgroud) 如何在CMakeLists.txt中为GNU g ++的编译器和链接器设置gprof标志?
我目前的做法,
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -pg")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -pg")
set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} -pg")
Run Code Online (Sandbox Code Playgroud)
不允许gprof对C++函数进行解码.有任何想法吗?(我正在使用C++ 11)
_ZNSaIwEC1Ev
_ZNSaIwEC2Ev
Run Code Online (Sandbox Code Playgroud)
这两个C++符号不同,但是将它们(使用C++ filt或类似实用程序)解压缩为相同的形式:
std::allocator<wchar_t>::allocator()
std::allocator<wchar_t>::allocator()
Run Code Online (Sandbox Code Playgroud)
为什么这样?它可能是一个demangler的缺陷还是其他什么?
我收到一些这样的错误:
dyld: lazy symbol binding failed: Symbol not found: __ZN2nm8RationalIxEC1ERKNS_10RubyObjectE
Referenced from: /Users/jwoods/Projects/nmatrix/lib/nmatrix.bundle
Expected in: flat namespace
dyld: Symbol not found: __ZN2nm8RationalIxEC1ERKNS_10RubyObjectE
Referenced from: /Users/jwoods/Projects/nmatrix/lib/nmatrix.bundle
Expected in: flat namespace
Run Code Online (Sandbox Code Playgroud)
然后同样的__ZN2nm7ComplexIfEC1ERKNS_10RubyObjectE
.
不幸的是,c++filt
似乎并不想分解这些。当我尝试在c++filtjs 在线界面中输入它们时中输入它们时,我得到“不是损坏的 C++ 符号”。
我对错误消息有点困惑,因为示例c++filtjs
给出的是_ZN9wikipedia7article8wikilinkC1ERKSs
,它代表wikipedia::article::wikilink::wikilink(std::string const&)
。我看到了几种模式,其中ZN#
、7
和8
for ::
、 和C1ERK
我猜测是对构造函数的某种传递引用。
我猜它是在抱怨它缺少我的构造函数之一class Rational
,例如Rational::Rational(RubyObject const&)
.Rational
但是,它是一个模板,因此了解缺少哪个版本会对我有所帮助。
但这里的问题实际上是我如何用手拆开。=)
的文档abi::__cxa_demangle
(例如https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01696.html)指定第二个参数char * output_buffer
需加malloc
-ed。
这意味着不允许在堆栈上分配如下所示的字符缓冲区。
enum {N = 256};
char output_buffer[N];
size_t output_length = 0;
int status = -4;
char * const result = std::__cxa_demangle(mangled_name,
output_buffer, &output_length, &status);
Run Code Online (Sandbox Code Playgroud)
两个问题:
为什么output_buffer
不允许在堆栈上?
为什么已经传递输出缓冲区时返回不同的指针?
受backtrace()示例的影响,我会想到一个像以下的API
// Demangle the symbol in 'mangled_name' and store the output
// in 'output_buffer' where 'output_buffer' is a caller supplied
// buffer of length 'output_buffer_length'. The API returns the
// number of bytes written to 'output_buffer' which is …
Run Code Online (Sandbox Code Playgroud) 在我的开发环境中,我正在使用GNU C++ 3.4.6编译代码库.代码正在开发中,不幸的是偶尔崩溃.很高兴能够通过demangler运行回溯,我使用c ++ filt 3.4.当函数具有许多STL参数时,问题就来了.考虑
My_callback::operator()(
Status&,
std::set<std::string> const&,
std::vector<My_parameter*> const&,
My_attribute_set const&,
std::vector<My_parameter_base*> const&,
std::vector<My_parameter> const&,
std::set<std::string> const&
)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
当此函数在回溯中时,我平台上的错位输出是:
(_ZN30My_callbackclER11StatusRKSt3setISsSt4lessISsESaISsEERKSt6vectorIP13My_parameterSaISB_EERK17My_attribute_setRKS9_IP18My_parameter_baseSaISK_EERKS9_ISA_SaISA_EES8_+0x76a) [0x13ffdaa]
Run Code Online (Sandbox Code Playgroud)
c ++ filt巧妙地将其解析为
(My_callback::operator()(Status&, std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::vector<My_parameter*, std::allocator<My_parameter*> > const&, My_attribute_set const&, std::vector<My_parameter_base*, std::allocator<My_parameter_base*> > const&, std::vector<My_parameter, std::allocator<My_parameter> > const&, std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)+0x76a) [0x13ffdaa]
Run Code Online (Sandbox Code Playgroud)
这与使用模板时遇到的编译器错误相同.但是,STL是一个相当规则且可识别的模板包.所以我希望有人在那里创建了一个增强版的c …
我正在尝试使用D编译调试我的第一个程序
dmd -debug hello.d
Run Code Online (Sandbox Code Playgroud)
但是当我通过GDB-7.6运行可执行文件时,它似乎不知道在哪里找到源代码并解码堆栈跟踪的格式(及其名称 - 解码).
是否GDB调试DMD生成的可执行文件尚未得到支持或者我错过了什么?
我一直在使用一些demangling代码,以帮助进行一些调试,而无需使用动态强制转换编写数千行,或者必须实现返回类名的虚函数.
template <class CLASS>
std::string getClassName(CLASS &theObject)
{
int status = 0;
// Convert real name to readable string
char *realName = abi::__cxa_demangle(typeid(theObject).name(), nullptr,
nullptr, &status);
ASSERT(status == 0); // Assert for success
VERIFY(realName, return std::string());
// Return as string + prevent memory leaks!
const std::string result(realName);
free(realName);
return result;
}
Run Code Online (Sandbox Code Playgroud)
这段代码背后的想法很简单,输出我们实际使用的类.虽然在切换到Ubuntu 14.04之后我无法再使用clang和c ++ - 11/c ++ - 14标准进行编译,所以我转而使用libc ++而不是libstdc ++.
在切换到libc ++之后,我注意到当我对'std :: string'进行demangle时它不再输出'std :: string',而是输出:
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >
Run Code Online (Sandbox Code Playgroud)
当然这是正确的,因为std :: string是std :: basic_string的typedef.虽然我在libc ++中都可以看到libstdc ++,但是使用typedef以相同的方式定义.所以我真的不明白为什么这个demangling通过切换到libc ++而改变了.
有人知道为什么这是不同的如何获得'std …