Visual Studio 2019怎么编译C语言源程序

Visual Studio 2019怎么编译C语言源程序,第1张

1、首先,打开C语言编辑器工具,然后在该工具中编写程序的源代码,如下图所示,然后进入下一步。

   

2、其次,完成上述步骤后,单击“编译”选项,再单击“组建”选项,再单击“执行”按钮,如下图所示,然后进入下一步。

   

3、接着,完成上述步骤后,单击Enter,如下图所示,然后进入下一步。

   

4、然后,完成上述步骤后,单击另存为选项,将文件保存到可以找到的文件夹,如下图所示,然后进入下一步。

   

5、随后,完成上述步骤后,打开保存在桌面上的文件夹,其中有一个Bebug文件夹,如下图所示,然后进入下一步。

   

6、最后,完成上述步骤后,打开Bebug文件夹,有一个扩展名为exe的文件,编译完成,如下图所示。这样,问题就解决了。

   

   

死循环是指程序中一段代码无限循环,导致程序无法终止,从而造成程序的崩溃或者系统崩溃。要解决死循环问题,可以采取以下方法:

1检查程序的流程控制语句,确保循环条件正确。

2检查程序中所有的递归调用,确保递归终止条件正确。

3使用调试工具,查看程序运行时的变量值和函数调用栈,找出问题的根源。

4插入断点,在程序执行到循环的某个特定点时中断程序,查看此时程序的状态,有利于定位问题。

5使用编译器的调试工具,如gdb,lldb等,对程序进行调试。

总之,在编写任何程序时,请务必注意检查代码逻辑,避免出现死循环问题。如果遇到了死循环问题,请着手解决,保证程序的正常运行。

我在学习的过程中,亲历的这件事:项目组要做一个复杂的工程,分为sdk工程和demo工程,里面有java和jni层

而so和aar是sdk工程中生成的,拷贝到demo工程中编译成最终apk。

java层的调试,是简单的。可以在运行的时候用sdk工程的android studio附加app,如果直接用demo附加,sdk中的源码有些并不好显现,只能通过工程目录jar文件来查看。

而so层的附加,默认情况下是不可行的,因为jni层调试是启动型调试,我们来看下android studio处理各种调试行为的过程:

java层调试:

adb push 1apk /data/local/tmp/1apk

am start -D -n comexampletest/MainActivity

android studio等待app状态正常

设置断点

执行remote connect,使用java调试协议附加

jni层调试:

adb push 1apk /data/local/tmp/1apk

am start -D -n comexampletest/MainActivity

android studio等待app状态正常

adb push lldb_server

/lldb_server 建立Lldb调试服务器

lldbfrontendexe 连接lldb调试服务器

向lldb_server发送附加调试命令

设置java/c层断点

执行remote connect,使用java调试协议附加

附加调试:

设置断点

执行remote connect,使用java调试协议附加

1在研究过程中发现jni层在编译时生成2个so,带符号的是obj/local目录下的so,apk中编译好的的so是可以不带符号的,此时用gdb调试,吧文件设置为带符号的so,即可调试。继续研究发现带符号的so和无符号的so,前面字节完全相同。

2android studio建立jni工程,需要自动安装lldb,修改gradle脚本,buildgradle

debug {

jniDebuggable true

}

3android studio附加按钮只是采用Run/Debug Configuration中的Remote Configuaration

从上述过程可见,附加并不能触发jni层调试步骤,而jni层调试步骤又是写死的,必须把前面加载apk部分去掉,于是对android-ndkjar做修改

最终实现了效果。其中一些重要的类:

IDevice:描述移动设备

Client:描述app包进程

AndroidNativeDebugProcess 控制jni调试,和lldb_server通信

AndroidNativeDeubgRunner 控制调试器部分

AndroidNativeRunConfiguration 配置Run/Debug Configuration中的Natvie-Debug选项,我在里面添加了用户app进程列表方便调试

AndroidNativeRunConfigurationEditor 配置界面控件

AndroidLLDBDebuggerContext jni层建立lldb调试器

AndroidLLDBDriver 实现基本调试功能

(lldb) po selfviewframe

(origin = (x = 0, y = 0), size = (width = 320, height = 568))

(origin = (x = 0, y = 0), size = (width = 320, height = 568))

(lldb)

例如 :

那么接下来这正是我们要解决的问题。

首先在终端输入三个命令

touch ~/lldbinit

echo display @import UIKit >> ~/lldbinit

echo target stop-hook add -o \"target stop-hook disable\" >> ~/lldbinit

输完命令后没有任何提示。那你就成功了。重新运行项目

看到这个,你就成功了。

现在运行到断点处,po selfviewframe

(lldb) po selfviewframe

(origin = (x = 0, y = 0), size = (width = 320, height = 568))

(origin = (x = 0, y = 0), size = (width = 320, height = 568))

(lldb)

一目了然。

那么不先用了怎么办呢,只要删掉lldbinit就好了。

1打开终端,

2输入 rm ~/lldbinit

回车,无反应就哦了。

现在我们来刨根问底的看看它是怎么做到的。。

首先:"po" : 我们知道,OC里所有的对象都是用指针表示的,所以一般打印的时候,打印出来的是对象的指针,而不是对象本身。如果我们想打印对象。我们需要使用命令选项:-O。为了更方便的使用,LLDB为expression -O --定义了一个别名:po

LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。平时用Xcode运行程序,实际走的都是LLDB。

LLDB有了一个启动时加载的文件~/lldbinit,每次启动都会加载。所以一些初始化的事儿,我们可以写入~/lldbinit中,比如给命令定义别名等。但是由于这时候程序还没有真正运行,也有部分 *** 作无法在里面玩,比如设置断点。

更多关于LLDB可以查看   浅谈LLDB

touch ~/lldbinit

如果~/lldbinit存在,使用touch指令可更改这个文件或目录的日期时间,包括存取时间和更改时间;

如果~/lldbinit不存在,touch指令会在当前目录下新建一个空白文件~/lldbinit。

echo display @import UIKit >> ~/lldbinit

echo:比如说你想往一个文件里面写一行东西, 可以通过命令:echo "需要写的东西"

 display :每次程序停止后显示表达式的值。表达式由程序定义的变量组成。

echo target stop-hook add -o \"target stop-hook disable\" >> ~/lldbinit

target stop-hook add表示添加stop-hook,-o的全称是--one-liner,表示添加一条命令。arget stop-hook只对breakpoint和watchpoint的程序stop生效,直接点击Xcode上的pause或者debug view hierarchy不会生效

想了解更多就去看看LLDB吧。UI图出来了。我干活去了。。。

最后一句,xcode控制台应该叫LLDB控制台。

以上就是关于Visual Studio 2019怎么编译C语言源程序全部的内容,包括:Visual Studio 2019怎么编译C语言源程序、如何解决死循环、如何实现在android studio中附加模式调试app等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10105240.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存