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

在gdb中调试Objective-C时向对象发送消息,不带符号

在GDB中调试Objective-C时,向对象发送消息时不带符号,可能是因为GDB无法识别Objective-C的语法。为了解决这个问题,您可以尝试以下方法:

  1. 使用LLDB代替GDB。LLDB是一个更强大的调试器,它对Objective-C的支持更好。要使用LLDB,请在Xcode中选择LLDB作为调试器。
  2. 使用po命令打印对象。po命令可以打印对象的属性和方法。例如,如果您要打印名为myObject的对象,可以在GDB中输入以下命令:
代码语言:txt
复制
po [myObject description]

这将打印出对象的描述信息。

  1. 使用call命令调用方法。如果您要调用名为myMethod的方法,可以在GDB中输入以下命令:
代码语言:txt
复制
call [myObject performSelector:@selector(myMethod)]

这将调用myMethod方法并返回其结果。

  1. 如果以上方法都不能解决问题,您可以尝试使用其他调试工具,例如Instruments或Xcode的内置调试器。这些工具可能会提供更多的Objective-C支持和更好的调试体验。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

2020-iOS最新面试题解析—1(原理篇)

访问一个僵尸对象,访问僵尸对象的成员变量或者其发消息 死循环 如何调试BAD_ACCESS错误 设置全局断点快速定位问题代码所在行 [image] 开启僵尸对象调试功能 [image] 简述下Objective-C...一个对象发送消息,runtime库会根据对象的isa指针找到该对象实际所属的类 然后该类的方法列表以及其父类方法列表寻找方法运行 如果,最顶层的父类(一般也就NSObject)依然找不到相应的方法...什么是method swizzling(俗称黑魔法) 简单说就是进行方法交换 Objective-C调用一个方法,其实是一个对象发送消息,查找消息的唯一依据是selector的名字。...Objective-Cnil发送消息是完全有效的——只是在运行时不会有任何作用 如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil) 如果方法返回值为指针类型,其指针大小为小于或者等于...如果一个nil对象发送消息,首先在寻找对象的isa指针就是0地址返回了,所以不会出现任何错误 objc一个对象发送消息obj foo和objc_msgSend()函数之间有什么关系?

1.6K21

GDB调试

回车GDB相当于重复上一个命令。 启动GDB运行程序 运行GDB调试a.out程序有以下几种方式: 方式一:直接运行gdb,然后gdb执行“file a.out”加载程序。...方式五:对运行的a.out,可以先按方式二启动,然后gdb中心“attach 19475”调试运行的a.out 进入到GDB后,可以通过help命令来获取帮助,GDB对命令做了分类,要获取详细说明可以查看...,但是会打印消息告诉你收到该信号 print:收到信号,打印一条消息 noprint:收到信号GDB不会高告诉你收到信号 pass/noignore:收到信号GDB不做处理,让程序的信号处理程序接手...修改变量: 上节设置变量中提到可以通过set命令来设置变量的值,但当你代码的变量和GDB的参数名字一样,需要如下设置。...问题四:全局符号介入 《从四个问题透析Linux下C++编译&链接》中提到全局符号介入,这种问题通常会引起core dump,要定位相关问题需要对代码执行路径有一定了解,通过GDB反馈的当前帧符号来源来定位符号是否来自非预期的库

2.1K10

自己动手写一个GDB|基本功能

所以,本文的约定是:在编写程序的过程,使用到的功能才会进行详细介绍。 简易的 GDB 我们要实现一个有如下功能的 GDB: 可以对一个可执行程序进行调试。 可以调试程序时,设置断点。...调试进程:主要用于调试进程 发送调试命令。...第三步:调试进程发送调试命令 我们来到最重要的一步了,就是要向被调试的进程发送调试命令。...用过 GDB 调试程序的同学都非常熟悉,我们可以调试的进程发送 单步调试、打印当前堆栈信息、查看某个变量的值 和 设置断点 等操作。...当被调试进程被内核挂起,内核会其父进程发送一个 SIGCHLD 信号,父进程可以通过调用 wait() 系统调用来捕获这个信息。 2. 然后我们一个循环内,跟踪进程执行指令的过程。 3.

1.1K40

runtime的那些事(一)——runtime基础介绍

Foundation 框架下 NSObject 类的方法 iOS 类体系,绝大部分Objective-C 类继承根类是 NSObject 类(NSProxy类除外,NSProxy定位更适合作为消息转发的代理抽象类...方法一定会有两个参数:消息接收者、消息方法名称 runtime 的核心是消息机制,其执行过程大致可分为三个部分:消息发送、动态方法解析、消息转发 编译阶段: 以上全都为不带参数的方法编译后的C函数结构...关于types参数,即 IMP 函数实现的返回值与参数类型,可以参考官方说明文档Objective-C Runtime Programming Guide 动态解析方法过程 对象方法 执行的顺序为...关于消息转发暂且放在一边,类方法动态解析过程,发现执行了两次+ (BOOL)resolveClassMethod:(SEL)sel解析;而在对象方法动态解析过程,+ (BOOL)resolveInstanceMethod...消息转发流程是把未识别的消息分发给了其他不同接收对象,又或者是将所有未识别消息发送给同一个接收对象,其具体实现方式完全可以自由控制。

1.3K20

Objective-C 的点符号一定是恶魔吗?

消息的点符号不仅仅是 Objective-C 代码的味道。我告诉你,它是恶魔! 更新:我最近改变了主意!请参阅我的文章《我接受的点符号...》...本文是Objective-C 的代码气味系列文章的一篇。* ......是的,这是夸张的说法。在有点符号的项目中,我确实能与点符号共存。但我不会自己写。...以下是我避免代码中使用点符号的三个原因: 1、点符号混淆了对象和结构体 告诉我,下面的代码是做什么用的?...问题在于,在前一种情况下,我们是 qux 方法发送信息。而在后一种情况下,我们是直接给 qux 实例变量赋值。这是两种截然不同的情况!...对于标量,这可能无关紧要,但对于对象,尤其是在编写正确的内存管理,这就大不相同了。 现在看看如果不使用点符号号会怎样: [self setQux:10]; 没有歧义。这显然是一条消息

7710

iOS开发入门笔记

是的,因为还没用到它的面向对象特性,哈哈! SmallTalk的消息传递语法风格 Objective-C的面向对象语法源自SmallTalk,消息传递(Message Passing)风格。...Java、C++世界,我们调用一个对象的某方法,Objective-C里,这称作给类型发送一个消息,这可不仅仅是文字游戏,他们的技术细节也是不同的。...而在Objective-C里,类型和消息的关系比较松散,消息处理到运行时(runtime)才会动态决定,给类型发送一个它无法处理的消息,也只会抛出一个异常,而不会挂掉。...“@”符号Objective-C是个很神奇的符号。 冒号也是方法名的一部分,method和method:是两个不同的方法名,不是overload,第二个带参数。...模拟器上操作,如果执行过程遇到了你Xcode里设置的断点,模拟器会暂停运行,并将当前活动窗口切换回Xcode,供你调试Xcode里增加或者取消了断点,不需要重新编译和安装应用即可生效。

3.9K60

iOS进阶之传递消息

而如果待调用的函数地址无法硬编码指令之中,就要在运行期读取出来,使用“动态绑定”。 Objective-C,如果对象传递消息,那就会使用动态绑定机制来决定需要调用的方法。...给对象发送消息可以这样写: id returnValue = [someObject messageName:parameter]; 例子: someObject:接收者 messageName...加入真是个瓶颈的话,那你可以只编写纯C函数,调用根据需要,把Objective-C对象的状态传进去。...这样的话,你就会明白,发送消息,代码究竟是如何执行的,而且也能理解,为何在调试的时候,栈“回溯”信息总是出现objc_msgSend。 要点 1️⃣消息由接受者、选择子及参数构成。...给某对象发送消息”(ivoke a message)也就相当于该对象上“调用方法”(call a method)。

75160

Hacker基础之Linux篇:进阶Linux命令二

今天我们进入Linux进阶的第二课 Linux C程序的调试 这里我们会解释一下怎样Linux下调试C程序 可能有的同学会问,这和Hacker有什么关系呢?...的全称是(GNU Debugger),是一个可移植的调试器,可运行在许多类Unix系统上,可用于许多编程语言,包括Ada,C,C++,Objective-C,Free Pascal,Fortran,Go...这里就会在第六行也就是mian函数的下一行有了一个断点 更多的gdb的知识,大家可以google或者bing pstack pstack是个脚本工具,可显示每个进程的栈跟踪 他的功能在gdb也有相应的实现...starce strace常用来跟踪进程执行时的系统调用和所介绍到的信号 Linux,进程不能直接访问硬件设备,当进程需要访问硬件设备(读取磁盘文件,接受网络数据等等),必须由用户态模式切换到内核态模式...我们看到的就是一个程序的结构 nm程序可用于列举符号和其类型和值,但是,要更仔细的研究目标文件这些命名段的内容,我们需要使用更强大的工具,我们下一节介绍

79120

Objective-C Runtime编程指南(1)

这主要用于调试GDB print-object命令打印从此方法返回的字符串。 NSObject的这个方法的实现不知道这个类包含了什么,所以它返回一个字符串与对象的名字和地址。...三、消息 objc_msgSend功能 Objective-C消息在运行时才被绑定到方法实现。...类的元素和对象结构如图所示: 当一个消息发送到一个对象消息传递函数跟随该对象的isa指针,指向调度表查找方法selector的类结构。...它的工作原理如下:当一个对象由于没有与消息的选择符匹配的方法而无法响应消息,运行时系统会通过发送forwardInvocation:消息来通知对象。...代理人代表另一个对象,并向其发送消息Objective-C的“远程消息传递”讨论的代理就是这样的代理。代理负责将消息转发到远程接收方的管理细节,确保参数值连接中被复制和检索,等等。

75520

GDB调试指南-启动调试

前言 GDB(GNU Debugger)是UNIX及UNIX-like下的强大调试工具,可以调试ada, c, c++, asm, minimal, d, fortran, objective-c, go...本文以C程序为例,介绍GDB启动调试的多种方式。 哪类程序可被调试 对于C程序来说,需要在编译加上-g参数,保留调试信息,否则不能使用GDB进行调试。...file查看strip状况 下面的情况也是不可调试的: 1file helloWorld 2helloWorld: (省略前面内容) stripped 如果最后是stripped,则说明该文件的符号表信息和调试信息已被去除...调试启动无参程序 例如: 1$ gdb helloWorld 2(gdb) 输入run命令,即可运行程序 调试启动带参程序 假设有以下程序,启动需要带参数: 1#include...对于attach方式,attach之前,使用file命令即可: 1$ gdb 2(gdb) file hello 3Reading symbols from hello...done. 4(gdb)attach

1.6K20

Android基础开发实践:如何分析Native Crash

符号偏移量(以字节为单位):12 由于app的so是通过jni代码编译而来,编译出的so如果有对应的调试信息,就可以通过这些调试信息找到符号对应的代码行,这些调试信息就是符号表,包括symtab以及...而下面这个则是带有符号表的so信息: ? 正常情况下,cmake编译的so是分为两种,一个是libs下的不带符号表的so,一个是objs下面带有符号表的so,调试的时候需要用到objs下面的文件。...任务,最终这些调试信息会在打包apk strip掉,可以gradle增加以下选项禁止strip: packagingOptions{    doNotStrip "*/*/*.so" } 有了带符号表的...Android上使用gdb编译不是一件轻松的事情,但是也并不复杂。Android SDK实际上已经包含了一套gdb调试工具,我们直接拿来使用即可。...不过还是不建议日常调试过程启用这类插件,避免丢掉有效的信息。

17K153

GDB调试入门,看这篇就够了

Debugger)是UNIX及UNIX-like下的强大调试工具,可以调试ada, c, c++, asm, minimal, d, fortran, objective-c, go, java,pascal...'::b $2 = {, , , } (gdb) 这里所打印的a值是我们定义testGdb.h文件里的,而b值是main函数的b。...或者去使能: disable display num #num为前面变量前的编号,不带num去使能所有 查看寄存器内容 (gdb)info registers rax 0x0...源码查看 前言 我们调试过程难免要对照源码进行查看,如果已经开始了调试,而查看源码或者编辑源码却要另外打开一个窗口,那未免显得太麻烦。文本将会介绍如何在GDB调试模式下查看源码或对源码进行编辑。...另外一种模式 启动,带上tui(Text User Interface)参数,会有意想不到的效果,它会将调试多个文本窗口呈现: gdb main -tuiGDB-TUI ?

7.3K62

动态的Objective-C——关于消息机制与运行时的探讨

因此Objective-C对象的真正行为往往是在运行时确定而非在编译确定,所以Objective-C又被称为是一种运行时的动态语言。    ...二、消息发送与转发机制 1.初窥消息发送机制     许多面向对象语言中方法的调用都是采用obj.function这样的方式,Objective-C语言中却是采用括号包裹的方式进行方法调用,例如[obj...实际上,Objective-C的每一句方法调用最后都会转换成一条消息进行发送。一条消息包含3部分内容:方法选择器、接收消息对象以及参数。objc_msgSend函数就是用来发送这种消息。...顺便说一下,如果你没有使用任何救命稻草,当某个对象发送了无法处理的消息,系统会最终调用到NSObject类的doesNotRecognizeSelector方法,这个方法会抛出异常信息,正因如此,你...三、发送消息的几个函数 1.最重要的两个发送消息函数     既然Objective-C函数最终的调用都是要转换成消息发送,那么了解下面这些消息发送函数是十分必要的,这些方法都定义objc/message.h

77540

Linux设备驱动程序(四)——调试技术

这个文件包含了4个整数值,分别是:当前的日志级别、未明确指定日志级别的默认消息级别、最小允许的日志级别以及引导的默认日志级别。该文件写人单个整数值,将会把当前日志级别修改为这个值。...为使用 seq_file,我们必须创建一个简单的“选代器(iterator)”对象,该对象用来表示项目序列的位置,每前进一步,该对象输出序列的一个项目。...这个方法要求内核具有“NFS-Root的能力,而且引导还需传入一些特定的参数。 六、调试器和相关工具 1、使用 gdb 启动调试必须把内核看作是一个应用程序。...当从 gdb 打印数据,内核仍在运行,不同数据项的值会在不同时刻有所变化;然而,gdb为了优化对 core 文件的访,会将已经读到的数据缓存起来。...对内核进行调试gdb 的许多常用功能都不可用。例如,gdb 不能修改内核数据,因为处理其内存映像之前,gdb 期望把待调试的程序运行在自己的控制之下。

57541

iOS 开发:『Runtime』详解(一)基础知识

消息机制的基本原理 Objective-C 语言 对象方法调用都是类似 [receiver selector]; 的形式,其本质就是让对象在运行时发送消息的过程。...Runtime 的概念解析 3.1 objc_msgSend 所有 Objective-C 方法调用在编译都会转化为对 C 函数 objc_msgSend 的调用。...消息机制的基本原理 我们讲解了 对象方法的调用过程,我们是通过对象的 isa 指针 找到 对应的 Class(类);然后 Class(类) 的 method list(方法列表) 找对应的 selector...到这里, Method 的结构就已经很清楚了,Method 将 SEL(方法名) 和 IMP(函数指针) 关联起来,当对一个对象发送消息,会通过给出的 SEL(方法名) 去找到 IMP(函数指针)...消息机制的基本原理 最后一步我们提到:若找不到对应的 selector,消息被转发或者临时 recever 添加这个 selector 对应的实现方法,否则就会发生崩溃。

1.2K40

GDB调试还不会?看这篇就够了!

启动调试 前言 GDB(GNU Debugger)是UNIX及UNIX-like下的强大调试工具,可以调试ada, c, c++, asm, minimal, d, fortran, objective-c...或者去使能: disable display num #num为前面变量前的编号,不带num去使能所有 查看寄存器内容 (gdb)info registers rax 0x0...来源:公众号【编程珠玑】 作者:守望先生 源码查看 前言 我们调试过程难免要对照源码进行查看,如果已经开始了调试,而查看源码或者编辑源码却要另外打开一个窗口,那未免显得太麻烦。...另外一种模式 启动,带上tui(Text User Interface)参数,会有意想不到的效果,它会将调试多个文本窗口呈现: gdb main -tui ?...总结 本文介绍了GDB调试的源码查看,源码编辑以及如何在GDB调试模式下执行shell命令。

4.1K21

Julia机器学习核心编程.2(LLVM和JIT)

• Clang是一个LLVM原生的C/C++/Objective-C编译器,旨在提供惊人的编译速度(例如,调试编译Objective-C代码比GCC快3倍),可以提供非常有用的错误警告,并且为构建优秀的源代码工具提供一个良好的平台...它具有Clang AST和表达式解析器、LLVM JIT、LLVM反汇编器等诸多功能,因此提供了出色的使用体验,并且加载符号相比GDB也要快得多,且内存效率更高。...它通过运行时检查代码,以便在第一间检测出内存安全错误(例如,缓冲区溢出),保护软件免于安全攻击,也可以像Valgrind一样用作内存安全错误调试工具。...计算,Julia使用JIT编译(也被称为动态翻译),编译执行在程序运行时,而不是程序运行前。...大多数情况下,代码需要被转换为机器代码,然后直接执行,但也可以被转换为另一种格式,JIT编译器通常不断地分析正在执行的代码,并且识别代码的一部分,使得从编译获得的性能加速超过编译该代码的性能开销。

86910

GDB调试指南-变量查看

前言 启动调试以及设置断点之后,就到了我们非常关键的一步-查看变量。GDB调试最大的目的之一就是走查代码,查看运行结果是否符合预期。...准备工作 查看变量之前,需要先启动调试并设置断点,该部分内容可参考《GDB调试指南-启动调试》和《GDB调试指南-断点设置》。后面的内容都基于某个位置已经断住。...'::b $2 = {1, 2, 3, 5} (gdb) 这里所打印的a值是我们定义testGdb.h文件里的,而b值是main函数的b。...1: y b 2: y e 如果想要清除可以使用 delete display num #num为前面变量前的编号,不带num清除所有。...或者去使能: disable display num #num为前面变量前的编号,不带num去使能所有 查看寄存器内容 (gdb)info registers rax 0x0

2.4K10

国密SSL通信的调试技巧

你还别说,我发现很多开发者宁可使用print大法,也不愿意采用单步调试,特别是嵌入式开发领域、移动端开发及前端开发。有多少人开发网页的js使用到了chrome和firefox的远程调试工具?...如果要用gdb调试,有可能还需要用到gdbserver,配置gdb和gdbserver之间的通信,配置代码的调试符号路径等等。...编译带调试符号的二进制程序文章搭建国密SSL开发测试环境说明了如何编译GmSSL,编译出来的是release版本,不带调试符号,这样就无法进行单步跟踪。...比如,如果我们希望调试客户端的HELLO处理流程,如果对代码结构有些了解,就可以知道是tls_process_server_hello函数处理的,如何调用到该函数的,函数内部处理过程是怎样的?...---- 网络抓包对于现场调试,特别是和第三方对接调试非常有用。而在国密SSL通信中,主要调试建立国密SSL连接过程,在这个过程,建立连接的几个阶段,分别发送了和接收了什么数据。

2.6K20
领券