在修补这个问题的答案的同时,我发现当从内部调用时,debug_backtrace()不会超出注册的函数register_shutdown_function().
这是中提到此评论为register_shutdown_function()在PHP文档,指出:
您可以从关闭函数内部调用debug_backtrace或debug_print_backtrace,以跟踪致命错误发生的位置.不幸的是,这些功能在关机功能中不起作用.
更详细地解释一下,对这个答案状态的评论:
不行.堆栈取消后会发生关闭功能.没有要转储的堆栈信息.
有没有办法绕过这个,迫使PHP保持堆栈跟踪直到进程完全终止,或者我们应该接受它作为给定由于PHP内部?
function log( msgOrObj ){
if(dev_mode){
console.log({
'message': msgOrObj,
'caller': arguments.callee.caller.toString()
});
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我试图编写一个简单的自定义控制台日志功能(如上所述).但是我很难找到调用者来自哪个文件和行.我能看到的最多就是调用它的函数.
有没有人做过类似的事情?或者这甚至可能吗?
第70行的somescript.js中使用的示例:
log('some very important message!')
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,它会分叉子进程.
子进程做了一些工作,在中间某处它给出了Segmentation错误.我使用GDB来调试这个,我用过:
set follow-fork-mode child
Run Code Online (Sandbox Code Playgroud)
我还为孩子中的一个函数设置了一个断点.但GDB并没有在我的断点暂停.
父进程也处理seg-fault,所以我不得不ctrl-c退出.然后,当我backtrace用来打印堆栈时,我得到的就是
没有堆栈
为什么没有设置断点,为什么我没有得到堆栈?
我一直想知道但是在Xcode中没有找到任何有用的命令列表.
我知道的一个,我使用的很多是输入命令的Backtrace bt,在遇到未捕获的异常之后的应用程序崩溃之后,它有时会给出问题所在的int.
你能分享更多有用的命令吗?它们可以让我们与调试器和应用程序本身进行交互吗?
谢谢
由于以下原因,来自核心文件的回溯信息剪切了有用的信息:
Backtrace已停止:没有足够的寄存器或内存可用于进一步展开。
为什么会出现此消息,我可以对此做些什么?
在我的应用程序中,我有设置信号处理程序来捕获Segfaults,并打印bactraces.进程启动时,我的应用程序会加载一些插件库.
如果我的应用程序崩溃了一个段错误,由于主可执行二进制文件中的错误,我可以用以下内容分析回溯:
addr2line -Cif -e ./myapplication 0x4...
Run Code Online (Sandbox Code Playgroud)
它准确地显示了函数和source_file:line_no
但是,如何分析是否由于插件中的错误而发生崩溃,如下面的回溯?
/opt/myapplication(_Z7sigsegvv+0x15)[0x504245]
/lib64/libpthread.so.0[0x3f1c40f500]
/opt/myapplication/modules/myplugin.so(_ZN11ICAPSection7processEP12CONNECTION_TP7Filebufi+0x6af)[0x7f5588fe4bbf]
/opt/myapplication/modules/myplugin.so(_Z11myplugin_reqmodP12CONNECTION_TP7Filebuf+0x68)[0x7f5588fe51e8]
/opt/myapplication(_ZN10Processors7ExecuteEiP12CONNECTION_TP7Filebuf+0x5b)[0x4e584b]
/opt/myapplication(_Z15process_requestP12CONNECTION_TP7Filebuf+0x462)[0x4efa92]
/opt/myapplication(_Z14handle_requestP12CONNECTION_T+0x1c6d)[0x4d4ded]
/opt/myapplication(_Z13process_entryP12CONNECTION_T+0x240)[0x4d79c0]
/lib64/libpthread.so.0[0x3f1c407851]
/lib64/libc.so.6(clone+0x6d)[0x3f1bce890d]
Run Code Online (Sandbox Code Playgroud)
我的应用程序和插件库都使用gcc编译并且未被删除.我的应用程序在执行时,使用dlopen加载plugin.so不幸的是,崩溃发生在我无法在gdb下运行应用程序的站点上.
谷歌疯狂地搜索答案,但所有讨论回溯和addr2line的网站排除了可能需要分析错误插件的情况.我希望一些善良的黑客知道这个困境的解决方案,并且可以分享一些见解.对于其他程序员来说,这将是非常宝贵的.
提前谢谢.
我想用来register_tick_function()挂钩以下调用并打印他们的堆栈跟踪debug_backtrace().
如果我运行以下代码.
<?php
function dump() {
// Replace this with var_dump(debug_backtrace()); to print the entire trace.
foreach (debug_backtrace() as $trace)
echo("Function ${trace['function']}() has been called" . PHP_EOL);
}
declare(ticks = 1);
register_tick_function('dump');
print("");
array_search('green', Array());
Run Code Online (Sandbox Code Playgroud)
它只打印dump()功能.
Function dump() has been called
Function dump() has been called
Function dump() has been called
Run Code Online (Sandbox Code Playgroud)
为什么我没有看到print()和array_search()跟踪数据?就像堆栈在调用之前已经重置一样dump().我也很确定它在过去是否正常工作.
我使用backtrace()和backtrace_symbols()来输出SIGSEGV和其他信号的回溯,格式如下:
0: [0xb750818]
1: /opt/server/libQtScript.so.4(+0x6f42a) [0xb782c42a]
2: /opt/server/libQtScript.so.4(+0x7bffc) [0xb7838ffc]
3: /opt/server/libQtScript.so.4(+0x86946) [0xb7843946]
4: /opt/server/libQtScript.so.4(+0x7c4bc) [0xb78394bc]
5: /opt/server/libQtScript.so.4(+0x86946) [0xb7843946]
6: /opt/server/libQtScript.so.4(+0x9603e) [0xb785303e]
7: /opt/server/libQtScript.so.4(_ZN12QScriptValue4callERKS_RK5QListIS_E+0x2e7) [0xb7891647]
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,帧#7对我来说很好,尽管帧1-6给了我一些"+ x"地址.
如何在"+ 0x6f42a"和GDB中的其他地址反汇编中得到确切的行?什么帧#0,没有描述模块,意味着什么?
我熟悉debug_backtracePHP 中的函数,并且真的觉得它很有用。但是,我有一个特定的、非常混乱的情况,我需要能够做相反的事情 - 在某处粘贴一个函数调用,并让它给我一个在该点之后调用的每个函数的列表,直到页面完全加载。
我们确实安装了 XDebug,对于大多数项目我都使用它。然而,这是一个非常混乱的代码库,其中有很多 ajax 和 php 代码实际上是作为字符串创建并呈现的(我没有编写这段代码!)而且我们都没有成功地让调试器工作。
bt崩溃后,我无法在调试模式下使用命令回溯。我已经搜索了,但是没有得到解决方案。我已经尝试过[NSThread callStackSymbols],但是它在控制台中给出了相同的消息:
记录的堆栈帧不支持控制台
我怎样才能做到这一点?
debug-backtrace ×10
backtrace ×3
gdb ×3
php ×3
c ×2
c++ ×2
debugging ×2
ios ×2
stack-trace ×2
addr2line ×1
fork ×1
javascript ×1
xcode ×1
xcode7.3 ×1