我是Android开发和Eclipse的新手,所以我只是把它全部设置好,我正在尝试Hello World教程.可悲的是,当我尝试运行程序时,我收到以下错误:
PANIC:无法打开:C:\ Users\Nathan Smith.android/avd/Droid_4.0.3.ini
我听说你应该避开这些路径中的空间.名称中的空格是问题所在吗?如果是这样,我该如何改变呢?
如果有人能帮我解决这个问题,那就太棒了.
顺便说一下,我还注意到我的SDK路径是C:\Users\Asus Laptop\android-sdks\应该将其更改为同一个用户?这不是故意的,是否有一种简单的方法可以让我将其更改为正确的用户?
Go为什么要写封闭频道?
虽然可以使用这个value, ok := <-channel成语从频道中读取,因此可以测试ok结果是否可以打开一个封闭的频道:
// reading from closed channel
package main
import "fmt"
func main() {
ch := make(chan int, 1)
ch <- 2
close(ch)
read(ch)
read(ch)
read(ch)
}
func read(ch <-chan int) {
i,ok := <- ch
if !ok {
fmt.Printf("channel is closed\n")
return
}
fmt.Printf("read %d from channel\n", i)
}
Run Code Online (Sandbox Code Playgroud)
输出:
read 2 from channel
channel is closed
channel is closed
Run Code Online (Sandbox Code Playgroud)
在Playground上运行"从封闭频道阅读"
写入可能关闭的频道更复杂,因为如果您只是在频道关闭时尝试写,Go会感到恐慌:
//writing to closed channel
package main
import (
"fmt"
) …Run Code Online (Sandbox Code Playgroud) 在Golang中,没有恢复的恐慌会导致进程崩溃,因此我最终将以下代码片段放在每个函数的开头:
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
Run Code Online (Sandbox Code Playgroud)
只是为了防止我的程序崩溃.现在我想知道,它真的是要走的路吗?因为我认为在任何地方放置相同的代码看起来有点奇怪.
在我看来,Java方式,将异常冒泡到调用函数,直到main函数是控制异常/恐慌的更好方法.我理解这是由Go的设计,但是像Go那样立即崩溃过程有什么好处?
我试图trace-cmd收集有关我看到的内核崩溃的更多信息.不幸的是,内核崩溃时出现"内核崩溃 - 不同步"消息(即套接字和文件缓冲区没有刷新,因此崩溃时缓冲区中的任何内容都不可避免地丢失).
有办法:
trace-cmd进程将其缓冲区刷新到文件系统或套接字?要么由于我trace-cmd在虚拟化环境中运行该命令,因此我不关心硬盘驱动器是否偶尔会损坏,因为我可以简单地恢复到最后一个良好的快照或重新部署VM.
我想确认的是内核的panic()功能和其他人一样kernel_halt()和machine_halt(),一旦被触发,保证机器的完全冻结.
那么,所有内核和用户进程都被冻结了吗?panic()调度程序是否可以中断?中断处理程序仍然可以执行?
使用案例:如果出现严重错误,我需要确保硬件看门狗重置机器.为此,我需要确保没有其他线程/进程使看门狗保持活跃状态.我需要触发完全停止系统.目前,在我的内核模块中,我只是调用panic()冻结所有内容.
另外,用户空间halt命令可以保证冻结系统吗?
谢谢.
编辑:根据:http://linux.die.net/man/2/reboot,我认为最好的方法是使用reboot(LINUX_REBOOT_CMD_HALT):"控制权给予ROM监视器,如果有的话"
go运行时可以检测panic(nil)并报告错误.
但是,我不能检测panic(nil)用recover()的defer红色的功能,因为它返回nil,所以我不能正常执行(没有出现恐慌)区别开来,因为我将测试的返回值recover()是零.
例如,
defer func(){
var err = recover()
if err != nil {
// Real serious situation. Panic from inner code.
// And we may have some critical resources which
// must be cleaned-up at any cases.
// However, this will not be executed for panic(nil)
rollback()
// I am still not sure that how should I treat `panic`…
// Should I just ignore them?
}
}() …Run Code Online (Sandbox Code Playgroud) 在开发中,我的代码使用.expect()和panic!()来处理致命错误。
他们的行为正是我在开发过程中所需要的。
当我使用 进行编译时--release,我希望它们的输出会变得更加简洁。
即这段代码:
let mut file_a = OpenOptions::new().write(true)
.read(true)
.open(args.file_a).expect("foo bar");
Run Code Online (Sandbox Code Playgroud)
生成:
thread 'main' panicked at 'foo bar: Os { code: 2, kind: NotFound, message: "No such file or directory" }', src/bin/vsapply.rs:131:59
Run Code Online (Sandbox Code Playgroud)
当我只想:
foo bar: No such file or directory
Run Code Online (Sandbox Code Playgroud)
当用--release.
已经有办法做到这一点了吗?
当我打开套接字连接时,我在套接字打开后立即将socket.Close()逻辑放入defer函数中.但是,如果socket.Close()会导致另一个恐慌怎么办?我应该总是在外部延迟内嵌套另一个延迟/恢复以防止我的程序崩溃吗?像这样:http://play.golang.org/p/GnEMQS-0jj
谢谢,Elgs
是否有可能"重新抛出"错误recover并保留原始堆栈跟踪?我知道如何做的最好的事情就是再次恐慌,但这确实会创建一个新的堆栈跟踪.
func do() {
defer func() {
cleanUp()
if x := recover(); x != nil {
handleError()
panic(x)
}
}()
doStuff()
}
Run Code Online (Sandbox Code Playgroud)
我想要这个的动机是,除非我的函数正常退出或handleError运行,否则我的程序会死锁.除非我保留原始的痕迹,否则我不知道它在哪里坠毁.
我的应用程序需要通过标准输出将日志以 JSON 格式发送到 fluentd。
当我试图处理恐慌并将 a&std::panic::PanicInfo作为 JSON安排时std::panic::set_hook,我找不到从 a 中检索回溯的方法&PanicInfo。
有没有办法从自定义钩子中的恐慌中检索回溯?